私は走っています
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(<>)
ループを配置するコマンド ライン スイッチであり、最後に print ステートメントがあります。この-l
スイッチは$/
、 and$\
を "\n" (改行) に設定しchomp
、入力を s に設定します。平たく言えば、改行を処理します。
ダイアモンド オペレータ<>
は、入力チャネルを自動的に選択するという点で「魔法」です。スクリプトに引数がある場合、スクリプトはそれをファイル名として解釈し、そのファイルを開いて読み取ります。そうでない場合は、STDIN をチェックします。あなたの場合、ファイル「datafile」を開きます。
そのワンライナーが行うことは、データファイルの各行を読み取り、 (引数が指定されていない場合に使用するため)$_
の長さに設定し、その数値を出力することです。$_
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
で提供)を1行に1回だけ実行するのではなく、1行に1回実行します。各ループ反復の下部で、行が出力されます。
実際の行が変数に読み込まれ、その$_
変数の内容がループ本体の下部に出力されるため$_
、ループ内の内容を変更することで、出力内容を変更できます。
引数のlength
ない演算子は、の長さをカウントし$_
ます。したがって$_=length
、印刷される前に、行をその長さに置き換えます。
-l
Perlインタープリターに入力から改行を削除させ(ここでの長さの値にはカウントされません)、自動的に出力に戻します(そうでない場合、出力は91810として一緒に詰まります)。