¿Por qué Perl siempre necesita que se proporcione la opción "-p" incluso cuando el archivo de entrada es estándar?

¿Por qué Perl siempre necesita que se proporcione la opción "-p" incluso cuando el archivo de entrada es estándar?

Actualización #2: Tuve un gran malentendido acerca de la -popción, ahora tengo claro que se usa para procesar todos los archivos proporcionados como argumento, pero todavía no entiendo por qué es necesario al leer la entrada de stdin.


Actualización #1: He notado que la -popción siempre es necesaria (al menos cuando se realiza una sustitución), incluso cuando se usa el separador predeterminado (carácter de nueva línea) y cuando el archivo de entrada es de una sola línea, y no entiendo muy bien por qué eliminar la -pLa opción de procesar una sola línea (que parece ser algo apropiado) rompe todo (es decir, no hay salida).

Por ejemplo, ejecutar echo -n 'test' | perl -pe 's/test/newstring/'los resultados newstringcomo se esperaba, pero echo -n 'test' | perl -e 's/test/newstring/'no genera nada.


pregunta original:

¿Por qué todavía es necesario dar la opción para sorber todo el archivo leído stdinen un comando Perl (p. ej. perl -0777 -e [...]) -ppara procesar realmente el archivo (p. ej. perl -0777 -pe [...])?

Entiendo que la -popción coloca un bucle alrededor de cada línea del comando, pero ¿por qué cambiar (en este caso eliminar) el separador no es suficiente para que Perl procese el archivo? O, ¿por qué es necesario, a pesar de que el archivo va a ser procesado sólo una vez, decirle a Perl que coloque un bucle alrededor de cada línea del comando?

Respuesta1

El perl --helpcomando dice que -p assumes a loop like -n but prints line also, like sed. sedes un editor de secuencias y se utiliza para manipular texto de forma muy parecida a como -pfunciona la opción con perl. -pes la única opción para perlimprimir la salida procesada. Sin esta -popción, la salida procesada no se puede imprimir. Entonces, como se muestra en mi ejemplo a continuación, si la impresión no se realiza, la cadena no se reemplaza.

ADVERTENCIA: ¡NO REEMPLAZAR EL -pCON -nYA QUE BLANCARÁ SU ARCHIVO!

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="nosplash"

~$ sudo perl -pi -e 's/nosplash/splash/' /etc/default/grub

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"

~$ sudo perl -i -e 's/splash/nosplash/' /etc/default/grub

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"

información relacionada