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を調べることによって
という二つの呼び出し形式を区別できる。前者は引数を直接書き換えるが、後者は書き換えない。