undefとリストコンテキスト

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 () しろ」という言葉を読んだ時にも)思っていたのですが、いかがでしょう。