無効コンテキストの罠

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を書きましょう、ということでしょうか‥‥