Atualização nº 2: tive um grande mal-entendido sobre a -p
opção, agora está claro para mim que ela é usada para processar todos os arquivos fornecidos como argumento, mas ainda não entendi muito bem por que isso é necessário ao ler a entrada do stdin
.
Atualização nº 1: Percebi que a -p
opção é sempre necessária (pelo menos ao realizar uma substituição), mesmo ao usar o separador padrão (caractere de nova linha) e quando o arquivo de entrada é uma única linha, e não entendo muito bem por que descartar o -p
a opção de processar uma única linha (o que parece ser algo apropriado) quebra tudo (ou seja, sem saída).
Por exemplo, executar echo -n 'test' | perl -pe 's/test/newstring/'
as saídas newstring
conforme esperado, mas echo -n 'test' | perl -e 's/test/newstring/'
não produzir nada.
Pergunta original:
Por que a leitura de todo o arquivo stdin
em um comando Perl (por exemplo perl -0777 -e [...]
) ainda precisa que a -p
opção seja fornecida para realmente processar o arquivo (por exemplo perl -0777 -pe [...]
)?
Entendo que a -p
opção coloca um loop em torno de cada linha do comando, mas por que alterar (neste caso, remover) o separador é suficiente para que o Perl processe o arquivo? Ou por que é necessário, apesar do arquivo ser processado apenas uma vez, dizer ao Perl para colocar um loop em cada linha do comando?
Responder1
O perl --help
comando afirma isso -p assumes a loop like -n but prints line also, like sed
. sed
é um editor de fluxo e é usado para manipular texto da mesma forma que a -p
opção funciona com perl
. -p
é a única opção para perl
imprimir a saída processada. Sem esta -p
opção, a saída processada não pode ser impressa. Assim como é mostrado no meu exemplo abaixo, se o print não acontecer, a string não será substituída.
AVISO: NÃO SUBSTITUA O -p
POR -n
, POIS ISSO APAGARÁ SEU ARQUIVO!
~$ 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"