Perl flags-pe,-pi,-p,-w,-d,-i,-t?
command-line (5)
He visto muchas formas de ejecutar código Perl o scripts, con diferentes banderas. Sin embargo, cuando trato de buscar lo que significa cada bandera, obtengo resultados principalmente para los sitios genéricos de Perl y no se encuentra allí información específica con respecto a las banderas o su uso.
A continuación se muestran las banderas que encuentro más a menudo, y no tengo ni idea de lo que significan:
- perl -pe
- perl -pi
- perl -p
- perl -w
- perl -d
- perl -i
- perl -t
Estaré muy agradecido si me dices qué significa cada uno de ellos y algunos casos de uso para ellos, o al menos dime una forma de descubrir su significado.
Como nota al margen: muy buen libro sobre perl one-liners: http://www.catonmat.net/blog/perl-one-liners-no-starch-press/
Para un gusto general, vea las publicaciones del blog del autor. Esta es sobre -pie, etc: http://www.catonmat.net/blog/introduction-to-perl-one-liners/ (y para divertirse, ver http://www.catonmat.net/blog/secret-perl-operators/ )
La bandera -p
básicamente ejecuta la secuencia de comandos con
while (<>) {
# exec here
}
continue {
print or die "-p destination: $!/n";
}
-e
permite pasar un script a STDIN
perl -e ''$x = "Hello world!/n"; print $x;''
-i
indica al intérprete que todos los datos pasados a STDIN
por el script de ejecución deben realizarse en el lugar.
-w
es lo mismo que use warnings;
, pero en un ámbito global más que local
-d
ejecuta el depurador Perl
Otros han mencionado perlrun. Si usa B :: Deparse, puede ver lo que significa (para la mayoría de las cosas):
$ perl -MO=Deparse -p -e 1
LINE: while (defined($_ = <ARGV>)) {
''???'';
}
continue {
die "-p destination: $!/n" unless print $_;
}
-e syntax OK
1 está representado por ''???'', porque está optimizado.
$ perl -MO=Deparse -p -i -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
''???'';
}
continue {
die "-p destination: $!/n" unless print $_;
}
-e syntax OK
-i establece $ ^ I, me gusta
$ perl -MO=Deparse -p -i.bak -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
''???'';
}
continue {
die "-p destination: $!/n" unless print $_;
}
-e syntax OK
Pero recuerde, <ARGV> usa 2 argumentos abiertos, así que no tiene nombres de archivos que comiencen con > <
o comiencen / finalicen con |
.
Sí, Google es notoriamente difícil para buscar signos de puntuación y, lamentablemente, Perl parece estar formado principalmente por signos de puntuación :-)
Los interruptores de la línea de comando están detallados en perlrun . (disponible desde la línea de comandos llamando a perldoc perlrun
)
Entrando en las opciones brevemente, uno por uno:
-p: Places a printing loop around your command so that it acts on each line of standard input. Used mostly so Perl can beat the pants off awk in terms of power AND simplicity :-) -n: Places a non-printing loop around your command. -e: Allows you to provide the program as an argument rather than in a file. You don''t want to have to create a script file for every little Perl one-liner. -i: Modifies your input file in-place (making a backup of the original). Handy to modify files without the {copy, delete-original, rename} process. -w: Activates some warnings. Any good Perl coder will use this. -d: Runs under the Perl debugger. For debugging your Perl code, obviously. -t: Treats certain "tainted" (dubious) code as warnings (proper taint mode will error on this dubious code). Used to beef up Perl security, especially when running code for other users, such as setuid scripts or web stuff.
También hay una bandera importante -n
que no se menciona en la lista.
-n
funciona igual que -p
, solo que no imprime $_
por defecto. Esto puede ser muy útil para filtrar archivos de texto.
De esta forma, Perl puede reemplazar grep | sed
grep | sed
en un solo trazador de líneas.
Por ejemplo:
perl -ne ''print "$1/n" if /Messages read: (/d+)/'' <my_input.txt
Se imprimirá cada valor entero encontrado después de "Mensajes leídos:", y nada más.