無効コンテキストの罠
sub func1 { my $self = shift; my $result = $self->func2; } sub func2 { my $self = shift; $self->check_wantarray; $self->dummy; } sub check_wantarray { my $self = shift; print defined(wantarray) ? (wantarray ? 'ARRAY' : 'SCALAR') : 'VOID'; }
dummyは任意のメソッド。上記の $self->check_wantarray; は無効コンテキストと判断され、期待通りにVOIDと出力される。
が、$self->dummy; の一文を削除すると、今度はスカラーコンテキストと判断されて出力はSCALARに変わってしまう。この理由が判らずにかなりハマった。
結論を言うと、これは $self->check_wantarray; の一文が関数の最後に評価される式としてfunc2に戻される、つまりfunc1からfunc2を呼び出している際のコンテキストが適用されるため。
結論は明示的にreturnを書きましょう、ということでしょうか‥‥