2012-05-03 20 views
-5

我跑Perl的一個班輪與-pl命令行選項

perl -ple '$_=length' datafile 

數據文件包含以下內容:

algorithm 
student government 
Fiumichino 

的結果是,它打印

9 
18 
10 

-p和-l選項有什麼作用?另外,什麼是$_

+0

數據文件中的單詞都是分開的行 – boogie

+0

請參閱perlrun和perlvar文檔。 –

回答

7

$_是默認輸入和模式搜索變量。 -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 
3

-p使Perl解釋器遍歷其輸入和運行的代碼(通過-e在這種情況下提供)一次每線,而不是隻有一次。在每個循環迭代的底部,它將輸出線。

將實際行讀入$_變量中,該變量的內容是打印在循環體底部的內容,因此通過更改循環內部的$_的內容,可以更改輸出內容。

無參數的length運算符計算的長度爲$_。因此$_=length在打印之前用它的長度替換該行。

-l只是導致Perl解釋器從輸入中刪除換行符(因此它們不會在這裏被計入長度值中)並自動將它們放回到輸出中(否則輸出會一起卡住爲91810)。

+0

編輯有點困惑,@PeterMortensen;小寫「perl」已經意味着「Perl解釋器」,而不是大寫的「Perl」,這意味着該語言......這是直接的駱駝合理化。 –