wantarray関数 - スカラかリストをコンテキストに応じて返却
Perlではコンテキストという概念があるので、スカラあるいはリストをコンテキストに応じて返却することができます。
sub func_name{ # 処理 ... return wantarray ? リスト : スカラ; }
wantarrayを使えば、リストコンテキストの場合とスカラコンテキストの場合を区別して、戻り値を返却することができます。
wantarrayが使われている標準関数にはlocaltime関数があります。
wantarray関数は使わないほうがよい
wantarray関数は、非常に発見しにくバグを生み出しだしがちなので、使用することはお勧めしません。たとえば、スカラが返ってくると思って、関数の引数に指定したら、リストが返っていたということが、起こりうるからです。
# スカラが返ってくると思っていたが、実際はリストが返ってきてしまう func(localtime());
このようなバグを避けるためには、wantarray関数は使わずに、戻り値はスカラ変数を返すか、リストを返すようにしましょう。
サンプル
wantarrayのサンプルです。
use strict; use warnings; # スカラかリストをコンテキストに応じて返却する # wantarray ? return リスト : return スカラ print "1: スカラかリストをコンテキストに応じて返却する\n"; my @nums = (1, 2, 3, 4, 5); my @odd_nums = grep_odd_nums(@nums); my $odd_nums_cnt = grep_odd_nums(@nums); print "1~5 の中で、奇数は、", join(',', @odd_nums) . "です。\n"; print "奇数の個数は、$odd_nums_cnt です。\n\n"; # 奇数のリストを返却するサブルーチン sub grep_odd_nums { my @nums = @_; my @odd_nums; for my $num (@nums) { if($num % 2 == 1) { push @odd_nums, $num; } } # リストコンテキストならば、 @odd_nums を返却 # スカラコンテキストならば、 @odd_nums の個数を返却 return wantarray ? @odd_nums : scalar @odd_nums; }