2012-05-03 14 views
-5

私は、データ・ファイルには、以下が含まれていPerlのワンライナー

perl -ple '$_=length' datafile 

を実行している:

algorithm 
student government 
Fiumichino 

結果は、それが

9 
18 
10 
を印刷していることです

-pオプションと-lオプションは何をしますか?また、$_とは何ですか?

+0

データファイルの単語はすべて別の行に表示されます – boogie

+0

perlrunおよびperlvarのマニュアルを参照してください。 –

答えて

7

$_は、デフォルトの入力およびパターン検索変数です。 -pは、暗黙的なwhile(<>)ループをプログラムの周りに置き、最後にprintステートメントを置くコマンドラインスイッチです。 -lスイッチは、$/$\を "\ n"(改行)に、chompを入力に設定します。また、慣れ親しみの言葉で改行を処理します。

ダイアモンドオペレーター<>は、入力チャンネルを自動的に選択する点で「魔法」です。スクリプトに引数がある場合は、それをファイル名として解釈し、そのファイルを開いて読み取ります。そうでなければ、STDINをチェックします。あなたのケースでは、それはファイル "データファイル"を開きます。そのonelinerがデータファイルの各ラインを読み取られないと(lengthは引数が供給されない場合$_を使用するため)$_の長さに$_を設定何

は、その番号を印刷します。

あなたはワンライナーを逆パースし、コードがどのように見えるかを確認できます

$ 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"とは対照的です。これは言語を意味します...それはまっすぐなCamelのjusageです。 –

関連する問題