0

重複したエントリを削除するために Perl でプログラムを試していました。言う

File : abc
11
22
11
11
22
33

出力は次のようになります。

11
22
33

Perlのワンライナーのおかげで仕事が楽になりました。しかし、私はそれを理解できませんでした。これは:

cat abc | perl -ne '$H{$_}++ or print'

いくつかの基本的な知識があれば、「 abc の出力は行ごとに渡され、それをハッシュにプッシュしています...しかし、何の-ne略ですか?なぜ彼らは使用し++たのですか?orステートメントは何ですか?説明は何ですか?

出現回数も調べる方法はありますか?

11 - 3
22 - 2
33 - 1
4

4 に答える 4

3

コマンドライン オプション -n は -e コードをループします。次のように入力すると、次のようになります。

  $ perl -n -e 'some code' file

次に、Perl はそれを次のように解釈します。

  LINE:
    while (<>) {
      # your code goes here, each iteration reads 
      # from file and puts into $_ variable
    }

あなたの例のファイルは、 cat コマンドからのパイプ出力です。

$H{$_}++ or print $_;

これにより、ファイルの行をキーとしてハッシュが作成されます。キーが存在しない場合は 1 の値が代入され、そうでない場合は後からインクリメントされます。最初の ($H{$_}++) は false と評価されるため、Perl は or-right 文を実行します。以下と同じです:

print $_ unless $H{$_}++;
于 2013-04-03T07:10:57.083 に答える
3

あなたは今のところ正しいです。これにより、ハッシュを使用しているコマンドにファイルabcがパイプされます。perl引数を理解するに-neは、ほぼ同等の次のコードと比較してください。

while (<>){
    $H{$_}++ or print $_
}

明確にするために、私もに変更printしましたprint $_

このワンライナーが機能する理由は、$H{$_}++を実行してハッシュ内のキーの値をインクリメントすると、キーに関連付けられた値の戻り値が得られるためです。

初めてキー ( の行abc) に遭遇すると、ハッシュ内のその値はデフォルトで になり0ます。そのため、or節はまだ満たされておらず、print $_(行の印刷) に進みます。しかし、その後キーに遭遇すると、その戻り値はso になり、Perl の正の整数は に評価される>0ため、or句は短絡trueします。

注目すべき興味深い点は、代わりに次のように書くと、このワンライナーが機能しないことです。

cat abc | perl -ne '++$H{$_} or print'

これは、ここでは事前にインクリメントしており、インクリメントに値が返されるためです。

于 2013-04-03T07:07:12.637 に答える
0

スイッチとは、次のneことを意味します。

-e = このコマンド ライン スイッチを使用すると、プログラムをファイルに書き込んで実行する代わりに、コマンド ラインからコードを実行できます。

-n = このコマンドライン スイッチを使用すると、標準入力のすべての行に対してプログラム (通常は -e で指定) を実行できます。

したがって、これは行ごとの出力が処理される方法です。

ここで、新しい値が来る場合のハッシュについては、存在しないため出力されますが、次回はインクリメントされ、 or 条件のために値は出力されません。

出現回数も調べるには、perl のワンライナーを使用するかどうかはわかりません。スクリプトは非常に簡単です。

U は、Linux で sort と uniq を使用して非常に簡単に行うこともできます。

cat abc |sort | uniq -c
于 2013-04-03T07:27:20.327 に答える
0

カウント例:

cat abc | perl -nle'$H{$_}++ ; END { for (keys %H) { print "$_ - $H{$_}" } }'
于 2013-04-03T07:30:16.757 に答える