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?