tutorial strawberry logo historia example perl

strawberry - ¿Cómo puedo pasar los argumentos a una línea de Perl?



perl tutorial (7)

A veces, romper el recinto de Perl es un buen truco para estas frases de una línea:

for d in 1 2 ; do cat kk2 | perl -lne '' print "''"${d}"'': OK" if /hdisk''"${d}"''/s+/'';done

Tengo un archivo, un archivo, como este:

$cat someFile hdisk1 active hdisk2 active

Yo uso este script de shell para comprobar:

$cat a.sh #!/usr/bin/ksh for d in 1 2 do grep -q "hdisk$d" someFile && echo "$d : ok" done

Estoy tratando de convertirlo a Perl:

$cat b.sh #!/usr/bin/ksh export d for d in 1 2 do cat someFile | perl -lane ''BEGIN{$d=$ENV{''d''};} print "$d: OK" if /hdisk$d/s+/'' done

Exporto la variable d en el script de shell y obtengo el valor usando %ENV en Perl. ¿Hay una mejor manera de pasar este valor al Perl de una sola línea?


Combinando algunas de las sugerencias anteriores y agregándole mi propio azúcar, lo haría de esta manera:

perl -se ''/hdisk([$d])/ && print "$1: ok/n" for <>'' -- -d=''[value]'' [file]

[valor] puede ser un número (es decir, 2), un rango (es decir, 2-4), una lista de números diferentes (es decir, 2 | 3 | 4) (o casi cualquier otra cosa, ese es un patrón válido) o incluso una variable bash que contiene uno de esos, ejemplo:

d=''2-3'' perl -se ''/hdisk([$d])/ && print "$1: ok/n" for <>'' -- -d=$d someFile

y [archivo] es su nombre de archivo (es decir, someFile ).


Eso se ve bien, pero yo usaría:

for d in $(seq 1 2); do perl -nle ''print "hdisk$ENV{d} OK" if $_ =~ /hdisk$ENV{d}/'' someFile; done


Mi solución es un poco diferente. Llegué a tu pregunta con una búsqueda en Google del título de tu pregunta, pero estoy tratando de ejecutar algo diferente. Aquí está en caso de que ayude a alguien:

Para su información, estaba usando tcsh en Solaris.

Tuve el siguiente de una sola línea:

perl -e ''use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*2));''

que produce el valor:

2013-05-06

Estaba intentando colocar esto en un script de shell para poder crear un archivo con una fecha en el nombre de archivo, de X números de días en el pasado. Lo intenté:

set dateVariable=`perl -e ''use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*$numberOfDaysPrior));''`

Pero esto no funcionó debido a la sustitución variable. Tuve que perder el tiempo con la cita, para que interpretara correctamente. Intenté encerrar todo el lote entre comillas dobles, pero esto hizo que el comando de Perl no fuera sintácticamente correcto, ya que se confundía con las comillas dobles alrededor del formato de fecha. Terminé con:

set dateVariable=`perl -e "use POSIX qw(strftime); print strftime(''%Y-%m-%d'', localtime(time()-3600*24*$numberOfDaysPrior));"`

Lo que funcionó muy bien para mí, sin tener que recurrir a ninguna variable de lujo exportando.

Me doy cuenta de que esto no responde exactamente a tu pregunta específica, ¡pero respondió al título y podría ayudar a alguien más!


Pásalo en la línea de comando, y estará disponible en @ARGV :

for d in 1 2 do perl -lne ''BEGIN {$d=shift} print "$d: OK" if /hdisk$d/s+/'' $d someFile done

Tenga en cuenta que el operador de shift en este contexto elimina el primer elemento de @ARGV , que es $d en este caso.


Puede habilitar el argumento rudimentario de la línea de comando con el interruptor "s". Una variable se define para cada argumento que comienza con un guión. El -- indica dónde comienzan los argumentos de la línea de comando.

for d in 1 2 ; do cat someFile | perl -slane '' print "$someParameter: OK" if /hdisk$someParameter/s+/'' -- -someParameter=$d; done

Ver: perlrun


Si tiene problemas para escribir una sola línea, quizás sea un poco difícil para una línea (solo mi opinión). Estoy de acuerdo con la sugerencia de @Fm y hago todo el asunto en Perl. Lee todo el archivo y luego pruébalo:

use strict; local $/ = '''' ; # Read in the whole file my $file = <> ; for my $d ( 1 .. 2 ) { print "$d: OK/n" if $file =~ /hdisk$d/s+/ }

Podrías hacerlo en bucle, pero eso sería más largo. Por supuesto que depende un poco del tamaño del archivo.

Tenga en cuenta que todos los ejemplos de Perl hasta ahora imprimirán un mensaje para cada coincidencia. ¿Puede estar seguro de que no haya duplicados?