Actualización #2: Tuve un gran malentendido acerca de la -p
opció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 -p
opció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 -p
La 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 newstring
como 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 stdin
en un comando Perl (p. ej. perl -0777 -e [...]
) -p
para procesar realmente el archivo (p. ej. perl -0777 -pe [...]
)?
Entiendo que la -p
opció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 --help
comando dice que -p assumes a loop like -n but prints line also, like sed
. sed
es un editor de secuencias y se utiliza para manipular texto de forma muy parecida a como -p
funciona la opción con perl
. -p
es la única opción para perl
imprimir la salida procesada. Sin esta -p
opció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 -p
CON -n
YA 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"