perl -ple '$_=length' datafile
數據文件包含以下內容:
algorithm
student government
Fiumichino
的結果是,它打印
9
18
10
-p和-l選項有什麼作用?另外,什麼是$_
?
perl -ple '$_=length' datafile
數據文件包含以下內容:
algorithm
student government
Fiumichino
的結果是,它打印
9
18
10
-p和-l選項有什麼作用?另外,什麼是$_
?
$_
是默認輸入和模式搜索變量。 -p
是一個命令行開關,在程序的周圍放置一個隱含的while(<>)
循環,並在最後打印語句。 -l
開關將$/
和$\
設置爲「\ n」(換行符)和chomp
作爲您的輸入,或者通俗地說,它會爲您處理換行符。
鑽石運營商<>
是「神奇的」,因爲它會自動選擇您的輸入頻道。如果腳本有參數,它會將其解釋爲文件名,並打開該文件並讀取它。如果沒有,它會檢查STDIN。在你的情況下,它打開文件「數據文件」。
什麼那oneliner不被讀取的數據文件的每一行,並設置$_
到的$_
的長度(因爲length
使用$_
如果沒有參數被供給),然後打印該號碼。
可以deparse一內襯和看到代碼的樣子:
$ perl -MO=Deparse -ple '$_=length' datafile
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
$_ = length $_;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK
-p
使Perl解釋器遍歷其輸入和運行的代碼(通過-e
在這種情況下提供)一次每線,而不是隻有一次。在每個循環迭代的底部,它將輸出線。
將實際行讀入$_
變量中,該變量的內容是打印在循環體底部的內容,因此通過更改循環內部的$_
的內容,可以更改輸出內容。
無參數的length
運算符計算的長度爲$_
。因此$_=length
在打印之前用它的長度替換該行。
-l
只是導致Perl解釋器從輸入中刪除換行符(因此它們不會在這裏被計入長度值中)並自動將它們放回到輸出中(否則輸出會一起卡住爲91810)。
編輯有點困惑,@PeterMortensen;小寫「perl」已經意味着「Perl解釋器」,而不是大寫的「Perl」,這意味着該語言......這是直接的駱駝合理化。 –
數據文件中的單詞都是分開的行 – boogie
請參閱perlrun和perlvar文檔。 –