wantarrayのもう一つの使い方

普通wantarrayは「arrayコンテキストか否か」を判定するために使われるが、voidコンテキストの判定にも使える。
イマイチ使い方がピンと来ていなかったが、HTML::Entitiesのソースを見ていてなるほどと思った。

sub encode_entities
{
    my $ref;
    if (defined wantarray) {
        my $x = $_[0];
        $ref = \$x;     # copy
    } else {
        $ref = \$_[0];  # modify in-place
    }

wantarrayは

subroutine() # voidコンテキスト
undef
$scalar = subroutine() # scalarコンテキスト
@array = subroutine() # arrayコンテキスト
1

になる。
よって、defined wantarrayを調べることによって

  • encode_entities($value);
  • *result = encode_entities($value);

という二つの呼び出し形式を区別できる。前者は引数を直接書き換えるが、後者は書き換えない。