-5

私は走っています

perl -ple '$_=length' datafile

データファイルには次のものが含まれます。

algorithm
student government
Fiumichino

その結果、印刷​​されます

9
18
10

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

4

2 に答える 2

7

$_デフォルトの入力およびパターン検索変数です。-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
于 2012-05-03T01:34:54.997 に答える
3

-pPerlインタープリターが入力をループし、コード(この場合は経由-eで提供)を1行に1回だけ実行するのではなく、1行に1回実行します。各ループ反復の下部で、行が出力されます。

実際の行が変数に読み込まれ、その$_変数の内容がループ本体の下部に出力されるため$_、ループ内の内容を変更することで、出力内容を変更できます。

引数のlengthない演算子は、の長さをカウントし$_ます。したがって$_=length、印刷される前に、行をその長さに置き換えます。

-lPerlインタープリターに入力から改行を削除させ(ここでの長さの値にはカウントされません)、自動的に出力に戻します(そうでない場合、出力は91810として一緒に詰まります)。

于 2012-05-03T01:43:05.643 に答える