「undefはリストコンテキストで真として評価されるから
」と述べているのに違和感がありました。あるリストがスカラーコンテキストで真または偽と評価される、ということはあると思いますが、リストコンテキストで真/偽、という評価のされ方はあるのでしょうか。
for (undef) { print "for\n"; last; }
for (foreach)ではリストを扱うので、このプログラムの場合では括弧内が (undef)
というリスト、つまりundefという値の要素1つを持つリストとして扱われている、ということのように思います。for (1) {}
, for (0) {}
という風に書いたのと同じで。
以下コマンドラインで試してみた結果。
$perl -MData::Dumper -e 'for(undef){print Dumper($_)}'
$VAR1 = undef; $perl -MData::Dumper -e 'for(1){print Dumper($_)}'
$VAR1 = 1; $perl -MData::Dumper -e 'for(0){print Dumper($_)}'
$VAR1 = 0; $perl -MData::Dumper -e 'for(""){print Dumper($_)}'
$VAR1 = ''; $perl -MData::Dumper -e 'for(()){print Dumper($_)}'
$perl -MData::Dumper -e 'for(){print Dumper($_)}'
syntax error at -e line 1, near "()" Execution of -e aborted due to compilation errors.
forの括弧内を「未定義」な状態にするには、for (())
と書く必要がありそうです。
ちなみにPerlの return は、引数を指定しない場合
をそれぞれ返すので、「何も返したくない場合」は単に return;
でいいんじゃないだろうか、と(YAPC::Asia 2006 Tokyo レポートにあった「return undef しないで return () しろ
」という言葉を読んだ時にも)思っていたのですが、いかがでしょう。