Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

for(each)のカッコ省略の謎

CGI::Sessionに以下のコードを見つけた。

Session.pm
...
  for my $plug qw(driver serializer id) {
...


あれ?、このループさせる配列はカッコでくくらないといけないんじゃなかったっけ?

for my $plug qw(driver serializer id) {
             # ↓
for my $plug (qw(driver serializer id)) {


と思って動かしてみたら動いた。

for my $plug qw(driver serializer id) {
  say $plug;
}
driver
serializer
id


まじかよ。


あでも、こういうのは書いたことがあるなあと思い返す。

print "$_\n" for @INC; # かっこない


んでもこれはだめか。

for @INC { print "$_\n" }
syntax error at - line 1, near "for @INC "
Execution of - aborted due to compilation errors.

エイリアス変数を使うのもだめ。

print "$inc\n" for $inc @INC; # かっこない
syntax error at - line 1, near "$inc @INC"
Execution of - aborted due to compilation errors.


@INCを範囲演算子つかったリストにしても同様の結果。

print "$_\n" for 1..10;    # ok
for 1..10 { print "$_\n" } # ng
print "$i\n" for $i 1..10; # ng

なんだろ、qw/STRING/が完璧なリストだからそれ自体 foreach のループ対象と決定しちゃうということかな?
後置修飾的に foreach 使うときは、もう右側に配列しかこないだろう的なコンテキストをもってくれてるということかな?