入力ファイルが stdin の場合でも、Perl では常に「-p」オプションを指定する必要があるのはなぜですか?

入力ファイルが stdin の場合でも、Perl では常に「-p」オプションを指定する必要があるのはなぜですか?

アップデート#2: オプションについて大きな誤解をしていました-pが、引数として提供されたすべてのファイルを処理するために使用されることは明らかですが、 からの入力を読み取るときにこれが必要な理由はまだよくわかりませんstdin


アップデート#1-p:デフォルトの区切り文字 (改行文字) を使用している場合や入力ファイルが 1 行の場合でも、このオプションは常に必要であることに気づきました(少なくとも置換を実行する場合)。また-p、1 行を処理するオプションを削除すると (適切な方法であると思われます)、すべてが壊れる (つまり、出力されない) 理由がよくわかりません。

たとえば、実行すると期待どおりにecho -n 'test' | perl -pe 's/test/newstring/'出力されますnewstringが、echo -n 'test' | perl -e 's/test/newstring/'何も出力されません。


元の質問:

stdinPerl コマンド (例perl -0777 -e [...])でファイル全体を読み込み、-p実際にファイルを処理するために (例perl -0777 -pe [...]) オプションを指定する必要があるのはなぜですか?

このオプションはコマンドの各行にループを配置することは理解しています-pが、区切り文字を変更 (この場合は削除) するだけでは Perl がファイルを処理できないのはなぜでしょうか。または、ファイルが 1 回だけ処理されるにもかかわらず、コマンドの各行にループを配置するように Perl に指示する必要があるのはなぜでしょうか。

答え1

コマンドは、 はストリーム エディターであり、オプションが で機能するのと同じようにテキストを操作するために使用されるperl --helpと述べています。は、処理された出力を印刷するための の唯一のオプションです。 オプションがないと、処理された出力を印刷できません。したがって、以下の例に示すように、印刷が行われない場合、文字列は置き換えられません。-p assumes a loop like -n but prints line also, like sedsed-pperl-pperl-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"

関連情報