私は、データ・ファイルには、以下が含まれていPerlのワンライナー
perl -ple '$_=length' datafile
を実行している:
algorithm
student government
Fiumichino
結果は、それが
9
18
10
を印刷していることです
-pオプションと-lオプションは何をしますか?また、$_
とは何ですか?
私は、データ・ファイルには、以下が含まれていPerlのワンライナー
perl -ple '$_=length' datafile
を実行している:
algorithm
student government
Fiumichino
結果は、それが
9
18
10
を印刷していることです
-pオプションと-lオプションは何をしますか?また、$_
とは何ですか?
$_
は、デフォルトの入力およびパターン検索変数です。 -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
-p
は、その入力をループにPerlインタプリタを引き起こし、(この場合は-e
を介して供給される)コードを実行するごとに一回ラインではなく、一度だけ合計。各ループ反復の最後に、行を出力します。
実際の行は変数$_
に読み込まれ、その変数の内容はループ本体の下部に表示されるものなので、ループ内の$_
の内容を変更すると、出力内容を変更できます。
引数なしのlength
演算子は、長さを$_
とカウントします。したがって、$_=length
は、印刷される前にその長さで行を置き換えます。
-l
は、Perlインタプリタに入力から改行を削除させ(したがって、ここでは長さの値には数えません)、自動的にそれらを出力に戻します(そうでない場合、出力は91810としてまとめられます)。
編集で混乱しているビット、@PeterMortensen;小文字の "perl"は既に "Perlインタプリタ"を意味します。これは大文字の "Perl"とは対照的です。これは言語を意味します...それはまっすぐなCamelのjusageです。 –
データファイルの単語はすべて別の行に表示されます – boogie
perlrunおよびperlvarのマニュアルを参照してください。 –