2008-04-16

サブルーチン末尾の括弧ありなしで振る舞いが変わるなんて知らなかったよ

次のような、よくある Perl のサブルーチンがあったとします。
sub foo {
my ($x) = @_;
print $x;
}
次のように、このサブルーチンを括弧ありで呼び出すのと、
&foo();
括弧なしで呼び出すのとで、その振る舞いが変わるなんて知らなかったよ。
&foo;
前者の括弧ありは、見たまま引数なしの振る舞いをします。が、後者の括弧なしは、引数なしにはなりません。なんと、現在の @_ を引き継ぐではないですか。

この振る舞いの違いに気がつかず、30分ほど悩んでしまいました。そこで『プログラミング Perl』を読んでみると、そのようにサブルーチンが解説されていました。先に仕様を確認すべきだった。

こういうコンテキストに依存することが Perl のやっかいさなんだけど、知ってしまうとこれが自然な感じがしてくるのが興味深いところですね。この振る舞いも今は違和感がありますが、その背景や役立つケースを知ると、また気分が変わって多用しはじめたりするのですね。

0 件のコメント: