今日のぺるる コンテキスト
コンテキストについて学んだよ。今回もとぴあさんとくらむさんに親切に教えてもらったよ。
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)
関連エントリー
- 今日のぺるる $_ の続き。 my @a = ("a", "b", "c"); for (@a) { for (@a) { print $_; } print "\n $...
- Perl 雑多メモ ファイル処理には IO::File を使え。(IO::Handle, IO::Seekable) LOCK_EX とかは use Fcntl...
- perl 5.19.9 の signatures 構文に引数リストをとれる機能を足す [tech] perl 5.19.9 の signatures 構文 (普通に引数を書ける構文) を試す | Mon, Feb 24. 20...
- xatena-go (はてな記法のような記法フォーマットパーサー) を作った Text-Xatena というはてな記法に近い記法をパースしてフォーマットする Perl のモジュールがある (ややこしい言いかただが……)...
- File::Temp, Path::Class, Path::Tiny Path::Class と Path::Tiny はほぼ同じことができるモジュールで、どっちを使っても特に変わりはないんですが「やっぱこっち...