Почему 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 размещать цикл вокруг каждой строки команды?

2
задан 9 June 2015 в 21:24

1 ответ

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

ПРЕДУПРЕЖДЕНИЕ: НЕ ЗАМЕНЯЙТЕ -p С -n AS ЭТО ЗАМЕНИТ ВАШ ФАЙЛ ПУСТЫМ МЕСТОМ!

~$ 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"
2
ответ дан 9 June 2015 в 21:24

Другие вопросы по тегам:

Похожие вопросы: