コンテキストについて学んだよ。今回もとぴあさんとくらむさんに親切に教えてもらったよ。
Perl ではコンテキストっていうのがあって、意識していないとハマるらしい (というかハマった)。サブルーチンを呼ぶところだけを見ても、そのサブルーチンが何を返すかがわからない。
$ perlsh main[1]$ @arr = localtime; 56 21 1 18 4 106 4 137 0 main[2]$ $scr = localtime; Thu May 18 01:22:02 2006
最初、なんでただの配列がスカラ変換のときに、タイムオブジェクト?のように見なされて時刻文字列になるんだ?って思ったんだけど、これは localtime がコンテキストによって挙動を変えた (!) 結果らしい。localtime っていう部分だけを見ても、localtime が何を返すかはわからない。
そのコンテキストとやらには、大きくわけてリストコンテキスト・スカラコンテキスト・void コンテキストがあるようだ。
sub context { if (defined wantarray) { # void context では undef if (wantarray) { # list context では true print "List Context!\n"; } else { print "Scalar Context!\n"; } } else { print "void Context!\n"; } return; } @arr = context; $scr = context; context; __END__ List Context! Scalar Context! void Context!
という感じで、サブルーチン内で wantarray を呼ぶことによりコンテキストの分岐ができる。wantarray っていう名前はおかしい (配列とリストは区別がある) みたいだけど、歴史的事情がきっとあるんだろう? perldoc でも wantlist であるべきだった的なことが書いてある。
たぶんコンテキストの理解は Perl では必須だろうけど、こういうのって他の言語だとあんまり見ないよね、っていう感じだった。
他今日知ったこと
- use vars は obsolete。変わりに our
- 擬似ハッシュには触るな (obsolete)