この非常に便利な1ライナーを見つけましたが、動作しますが、ファイルの行を2回循環させる方法を理解できません。ファイルの一意の行を印刷するためのPerl 6ワンライナー
perl6 -ne 'state %l; .say if ++%l{$_} == 1' input-file.txt
この非常に便利な1ライナーを見つけましたが、動作しますが、ファイルの行を2回循環させる方法を理解できません。ファイルの一意の行を印刷するためのPerl 6ワンライナー
perl6 -ne 'state %l; .say if ++%l{$_} == 1' input-file.txt
1サイクルのみがあります。
%l
にすべての行をキーとして収集し、値はそれを見た回数です。
これが初めての場合(… == 1
)、現在の行のコピーが表示され、それが印刷されます。
それは基本的に同じ作品:私は… if ++$… == 1
が代わりに… unless $…++
を使用した理由は&prefix:«++»
は、潜在的に、より効率的に(応じて若干よりパフォーマンス&postfix:«++»
別のよりもあることだと思う
my %l;
for $*ARGFILES.lines() { # this is basically what `-n` does
++%l{ $_ }; # update the count
.say if %l{ $_ } == 1; # print it if this is the first time it was seen
}
を.unique
の実装で)それを書く方法は:
perl6 -e '.put for $*ARGFILES.lines.unique' input-file.txt
これを解凍してみましょう。 -n
オプションは、コードの周りfor lines() { ... }
ループを追加しますので、私たちは
for lines() {
state %l;
.say if ++%l{$_} == 1
}
なぜstate
VARがありますか?その1行の暗黙のループの外側のスコープに変数を宣言するのは簡単な方法ではありません。そうしないと、
my %l;
for lines() {
.say if ++%l{$_} == 1
}
%l
$_
に格納されている)ラインが見られた回数を追跡することを記述します。それは自動化を使用するので、最初に行が見えるときには、
++
演算子が自動的にハッシュにそれを追加します。
.say
は$_.say
ありがとう! 'lines'の後の'() 'はどういう意味ですか? –
'lines'は引数をとりません。この状況では、 '{}'が 'lines'サブの引数として取られるので、これが必要です。 –
感謝の省略形です!私は論理を誤解しましたが、実際それは非常に簡単です。 –
'$ * ARGFILES'で行を呼び出す必要はありません。' lines() 'だけを呼び出すと' $ * ARGFILES'で既に動作します。 – timotimo