2011-08-16 17 views
12

Perlで単一行foreachループを使用することはできますか?Perl foreachループを1行に書くことは可能ですか?

$hash{$thing}++ foreach my $thing (@things); 

私はオープン文は多分壊れていることを知って、これは、このような

die "Invalid file!\n" if (open($Handle, "file.txt")); 

、他の多くのコマンドで可能です知っている:)

+0

@Zaid: "インラインループ"?たぶんそれは私のものかもしれませんが、私は以前のタイトルがもっとわかりやすいと感じました。:/ – musiKk

+0

@musiKk:Revised。あなたの2番目のステートメントで – Zaid

+0

: 'if'を' unless'に変更するか、より一般的なイディオム(と3arg openとレキシカルハンドル)を使用します 'open $ handle、 '<'、 'file.txt' $! ";"もちろん、読み込みではなく書き込みのためにファイルを開く場合は '> ''を使用してください。 –

答えて

29

ほとんど。 foreachのサフィックスでは、$ _を使用する必要があります。

$hash{$_}++ foreach @things; 

または同等に(forforeach以来構文については、エイリアスされている):

$hash{$_}++ for @things; 
+1

+1と簡潔さのために 'のために'。 –

+0

私はちょうど私が投稿した後に気づいたが、迅速な返信に感謝します。私は単一のステートメントで名前付き変数が少し不合理であることを認識しました。 –

+0

この構文が文書化されているところを教えてください。 perlsynのページはこれを言及しません。 – user907860

3

はあなたが行うことができます。

foreach my $thing (@things) {$hash{$thing}++}; 

場合レキシカルスコープの変数で1行に書いておきます。 foreachを反転してループスコープの変数を保持することはできません。

+5

"foreachを逆転してループスコープの変数を保持することはできません。"その名前ではなく、いいえ、だから何ですか? 1行の 'foreach'には名前付き話題化装置は必要ありません。 '$ハッシュ{$ _} ++は@物事のために'ハッシュ**それは**各事柄、またはより多くの英語、ハッシュ**の**事を言います。 '$ _'は" it "と読むべきです。そして、 "it"はループスコープの変数になることが保証されています。さらに、それはループ** IFF **に語彙的にスコープされたブランドの新しいプライベート変数になります。その名前の既存のレキシカル(すでに '$ _')がすでにスコープ内にあり、それ以外の場合は動的スコープがあれば。どちらもループスコープです。 – tchrist

関連する問題