Почему Perl всегда требует указания параметра «-p», даже если входной файл — stdin?

Почему Perl всегда требует указания параметра «-p», даже если входной файл — stdin?

Обновление №2: У меня было большое недопонимание по поводу этой -pопции, теперь мне ясно, что она используется для обработки всех файлов, предоставленных в качестве аргумента, но я все еще не совсем понимаю, зачем это нужно при чтении входных данных из stdin.


Обновление №1: Я заметил, что эта -pопция всегда необходима (по крайней мере, при выполнении подстановки), даже при использовании разделителя по умолчанию (символа новой строки) и когда входной файл представляет собой одну строку, и я не совсем понимаю, почему отказ от опции -pобработки одной строки (что, кажется, является чем-то подходящим) ломает все (т. е. не выводит никаких данных).

Например, запуск echo -n 'test' | perl -pe 's/test/newstring/'выводит newstringожидаемые данные, но echo -n 'test' | perl -e 's/test/newstring/'не выводит ничего.


Исходный вопрос:

Почему для чтения всего файла stdinкомандой Perl (например perl -0777 -e [...], ) все равно требуется -pуказать опцию для фактической обработки файла (например, perl -0777 -pe [...])?

Я понимаю, что -pопция помещает цикл вокруг каждой строки команды, но почему недостаточно изменить (в данном случае удалить) разделитель, чтобы Perl обработал файл? Или почему необходимо, несмотря на то, что файл будет обработан только один раз, указать Perl поместить цикл вокруг каждой строки команды?

решение1

Команда perl --helpутверждает, что -p assumes a loop like -n but prints line also, like sed. sed— это потоковый редактор, который используется для обработки текста во многом подобно тому, как -pработает опция с perl. -p— единственная опция для perlпечати обработанного вывода. Без опции -pобработанный вывод не может быть напечатан. Поэтому, как показано в моем примере ниже, если печать не происходит, строка не заменяется.

ВНИМАНИЕ: НЕ ЗАМЕНЯЙТЕ НА, -pПОСКОЛЬКУ -nЭТО УБЕРЕТ ВАШ ФАЙЛ!

~$ 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"

Связанный контент