2017-12-21 17 views

答えて

3

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 
+0

感謝の省略形です!私は論理を誤解しましたが、実際それは非常に簡単です。 –

+0

'$ * ARGFILES'で行を呼び出す必要はありません。' lines() 'だけを呼び出すと' $ * ARGFILES'で既に動作します。 – timotimo

2

これを解凍してみましょう。 -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

+0

ありがとう! 'lines'の後の'() 'はどういう意味ですか? –

+1

'lines'は引数をとりません。この状況では、 '{}'が 'lines'サブの引数として取られるので、これが必要です。 –

関連する問題