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

1

Atualização # 2 : Eu tive um ótimo entendimento sobre a opção -p , agora está claro para mim que é usado para processar todos os arquivos fornecidos como argumento, mas eu ainda não Entendo por que isso é necessário ao ler a entrada de stdin .

Atualização # 1 : notei que a opção -p é sempre necessária (pelo menos ao realizar uma substituição), mesmo quando se usa o separador de surdos (caractere de nova linha) e quando a entrada file é uma linha única, e eu não entendo muito bem por que deixar a opção -p para processar uma única linha (o que parece ser algo apropriado) quebra tudo (ou seja, sem saída).

Por exemplo, executando echo -n 'test' | perl -pe 's/test/newstring/' outputs newstring como esperado, mas echo -n 'test' | perl -e 's/test/newstring/' não produz nada.

Pergunta original :

Por que a leitura de todo o arquivo de stdin em um comando Perl (por exemplo, perl -0777 -e [...] ) ainda precisa da opção -p para processar o arquivo (por exemplo, perl -0777 -pe [...] )?

Eu entendo que a opção -p coloca um loop em torno de cada linha do comando, mas por que não está mudando (neste caso, removendo) o separador o suficiente para que o Perl processe o arquivo? Ou, por que é necessário, apesar do fato de que o arquivo será processado apenas uma vez, para dizer ao Perl para colocar um laço ao redor de cada linha do comando?

    
por kos 09.06.2015 / 18:38

1 resposta

2

O comando perl --help indica que -p assumes a loop like -n but prints line also, like sed . sed é um editor de fluxo e é usado para manipular texto de forma semelhante ao modo como a opção -p funciona com perl . -p é a única opção para perl imprimir a saída processada. Sem a opção -p , a saída processada não pode ser impressa. Então, como é mostrado no meu exemplo abaixo, se a impressão não acontecer, a string não será substituída.

AVISO: NÃO SUBSTITUA O -p WITH -n , pois o seu arquivo será removido!

~$ 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"
    
por Terrance 09.06.2015 / 20:49