为什么即使输入文件是 stdin,Perl 也总是需要提供“-p”选项?

为什么即使输入文件是 stdin,Perl 也总是需要提供“-p”选项?

更新 #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是一个流编辑器,用于处理文本,就像选项-pperl.的工作方式一样,是打印处理后的输出-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"

相关内容