為什麼即使輸入檔是 stdin,Perl 也總是需要給出“-p”選項?

為什麼即使輸入檔是 stdin,Perl 也總是需要給出“-p”選項?

更新#2:我對該-p選項有一個很大的誤解,現在​​我很清楚它用於處理作為參數提供的所有文件,但我仍然不太明白為什麼在讀取輸入時需要這樣做stdin


更新#1:我注意到該-p選項總是需要的(至少在執行替換時),即使使用預設分隔符號(換行符)並且輸入檔案是單行時也是如此,而且我不太明白為什麼要刪除-p處理單行的選項(這似乎是合適的)會破壞一切(即沒有輸出)。

例如,按預期運行echo -n 'test' | perl -pe 's/test/newstring/'輸出,但沒有輸出任何內容。newstringecho -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 sedsed是一個流編輯器,用於操作文本,就像該-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"

相關內容