Indicadores de Perl -pe, -pi, -p, -w, -d, -i, -t?

107

He visto muchas formas de ejecutar código o scripts Perl, con diferentes banderas. Sin embargo, cuando trato de buscar en Google lo que significa cada bandera, obtengo resultados principalmente en sitios de Perl genéricos y no se encuentra información específica sobre las banderas o su uso.

A continuación se muestran las banderas que encuentro con más frecuencia, 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 dice qué significa cada uno de ellos y algunos casos de uso para ellos, o al menos me dice una forma de averiguar su significado.

Tudor Constantin
fuente
21
Buscar en Google respuestas básicas sobre perl a menudo lo llevará a algunos sitios realmente inútiles. Siempre verifique primero la propia documentación de perl.
ysth
2
Secundado. En este caso, perldoc perlruntiene una lista de todas las opciones de línea de comandos que acepta Perl.
Sherm Pendley
1
Problema de Google: Google interpreta el signo menos en el sentido de "excluir este término". Para evitar este comportamiento, coloque el término que contiene el signo menos entre comillas.
Roger Krueger

Respuestas:

147

Sí, Google es notoriamente difícil para levantar la puntuacion y, por desgracia, Perl no parecen ser en su mayoría compuesta de puntuacion :-)

Los interruptores de la línea de comando se detallan en perlrun . (disponible desde la línea de comando llamando perldoc perlrun)

Entrando en las opciones brevemente, una por una:

-p: coloca un bucle de impresión alrededor de su comando para que actúe en cada
    línea de entrada estándar. Se usa principalmente para que Perl pueda vencer
    pantalones off awk en términos de potencia Y simplicidad :-)
-n: coloca un bucle sin impresión alrededor de su comando.
-e: le permite proporcionar el programa como un argumento en lugar de
    que en un archivo. No quieres tener que crear un script
    archivo para cada pequeño texto de una sola línea de Perl.
-i: modifica su archivo de entrada en el lugar (haciendo una copia de seguridad del
    original). Útil para modificar archivos sin la {copia,
    borrar-original, renombrar} proceso.
-w: Activa algunas advertencias. Cualquier buen codificador de Perl usará esto.
-d: se ejecuta en el depurador de Perl. Para depurar su código Perl,
    obviamente.
-t: trata cierto código "contaminado" (dudoso) como advertencias (adecuado
    el modo de contaminación producirá un error en este código dudoso). Acostumbrado a la carne
    mejorar la seguridad de Perl, especialmente cuando se ejecuta código para otros
    usuarios, como scripts de setuid o material web.
paxdiablo
fuente
1
No me di cuenta de que te refieres perldoc perlrun. He eliminado mi respuesta. :-)
Alan Haggai Alavi
4
-wen general, debe evitarse, ya que habilita advertencias para todo el código, incluidos los módulos CPAN que no se escribieron teniendo en cuenta las advertencias. Los resultados son en general bastante ruidosos, además de bastante inútiles.
anochecer-inactivo-
9
-wgeneralmente se evita, pero debe reemplazarse con use warningssu propio código.
plusplus
6
@duskwuff: En general estoy de acuerdo, y lo hago use warningsen mi propio código, pero -w tiene un uso - ayuda a eliminar los módulos CPAN mal escritos. :-)
Sherm Pendley
2
@IanBytchek Los argumentos que pueden / deben tomar un parámetro adicional no pueden estar dentro de una lista comprimida. -itoma una extensión para la copia de seguridad. -etoma un comando de perl. En -0ep le está diciendo a Perl que 'p' es un comando perl en lugar de un argumento. Eso no funcionará nada bien.
tjd
10

La -pbandera básicamente ejecuta el script con

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e le permite pasar un script a STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-iindica al intérprete que todos los datos transmitidos STDINpor el script en ejecución deben realizarse en el lugar.

-wes lo mismo que use warnings;, pero en un ámbito global en lugar de local

-d ejecuta el depurador de Perl

zellio
fuente
2
-wno es exactamente lo mismo que use warnings, este último tiene el alcance del archivo local
plusplus
plusplus, verdadera respuesta de parcheo.
zellio
2
Pasar el script como argumento no es lo mismo que pasarlo en STDIN. -i toma los nombres de archivo de la lista de argumentos, no stdin. Si bien STDIN se asocia a menudo con la terminal de control y se hereda del shell que lee stdin y configura la lista de argumentos en perl, NO son lo mismo.
William Pursell
8

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, como

$ 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 tenga nombres de archivo que comiencen con > <o comiencen / terminen con |.

liame
fuente
4

También hay una bandera importante -nque no se menciona en la lista.

-nfunciona igual que -p, solo que no imprime $_por defecto. Esto puede resultar muy útil para filtrar archivos de texto.

De esta manera, Perl puede reemplazar grep | seden una sola línea.

Por ejemplo:

perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

Imprimirá cada valor entero encontrado después de "Mensajes leídos:", y nada más.

rustyx
fuente
Esto se puede simplificar aún más. No hay necesidad de "imprimir" $ 1 \ n "". En su lugar, puede utilizar "imprimir".
Devoró elisio
No, no puede, no print $1es lo mismo que print( print $_).
rustyx
Puede: echo abc | perl -nw -e "print if (1)"imprimirá abc. No necesita la $1referencia.
Devoró elysium
@devouredelysium: Sí, pero no quiere imprimir la línea completa, sino solo el número que coincide con la expresión regular.
Ingo Blechschmidt