Perl の wantarray 関数で返り値の扱いを確認する ― 2020年12月22日 22時28分
こんにちは、nanto_vi です。この記事は Perl Advent Calendar の 22 日目です。
Perl の特徴のひとつに関数が多値を返せるというのがあります。Go 言語と同様に、処理の結果とエラーの値を同時に返すことができます。
sub do_something {
...
return (undef, $error) if $something_wrong;
return ($result, undef);
}
my ($result, $error) = do_something();
上述の do_something
関数はリストを返し、その第 1 要素に処理結果を、第 2 要素にエラーの値を含んでいます。ところが、ここでうっかり、
my $result = do_something();
とリストを使わずに返り値を受け取ってしまうと、変数 $result
にエラーの値が代入されてしまいます。(リストをスカラコンテキストで評価した場合、そのリストの末尾要素が返ります。)
このような事態を防ぐために、wantarray
関数を使って呼び出し側がリストコンテキストで返り値を受け取っているか確かめられます。
use Carp qw(croak);
sub do_something {
croak 'Must handle error' unless wantarray;
...
return (undef, $error) if $something_wrong;
return ($result, undef);
}
my $result = do_something();
# => 'Must handle error' 例外が投げられる。
ここでエラーの値だけを受け取りたいときは、次のようにリストの要素として undef
を書けます。
my (undef, $error) = do_something();
空リストに代入することで、返り値をすべて無視することもできます。
() = do_something();
また、defined
関数と組み合わせて呼び出し側が返り値を受け取っているか確かめられます。
sub do_another_thing {
croak 'Must handle error' unless defined wantarray;
return $error if $something_wrong;
return undef;
}
do_another_thing();
# => 'Must handle error' 例外が投げられる。
my $error = do_another_thing();
# => 例外が投げられず、エラーの値が返る。
この場合、返り値を無視するには scalar
関数が使えます。
scalar do_another_thing();
コメント
トラックバック
このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2020/12/22/9329502/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。