Por que o Perl sempre precisa que a opção "-p" seja fornecida mesmo quando o arquivo de entrada é stdin?

Por que o Perl sempre precisa que a opção "-p" seja fornecida mesmo quando o arquivo de entrada é stdin?

Atualização nº 2: tive um grande mal-entendido sobre a -popçã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 -popçã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 -pa 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 newstringconforme esperado, mas echo -n 'test' | perl -e 's/test/newstring/'não produzir nada.


Pergunta original:

Por que a leitura de todo o arquivo stdinem um comando Perl (por exemplo perl -0777 -e [...]) ainda precisa que a -popção seja fornecida para realmente processar o arquivo (por exemplo perl -0777 -pe [...])?

Entendo que a -popçã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 --helpcomando 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 -popção funciona com perl. -pé a única opção para perlimprimir a saída processada. Sem esta -popçã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 -pPOR -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"

informação relacionada