perlで多値?

http://d.hatena.ne.jp/smeghead/20080803/multi で、id:ytakenaka さんに反応して、Luaの多値について書いたのですが、考えてみたら、perlで多値風の振舞いを持たせることも一応できるのに気が付きました。

早速コード

#!/usr/bin/perl
use strict;
use warnings;
sub multiple_value {
my $val = 1;
return $val, 'second value.' if wantarray;
return $val;
}
my $aa = multiple_value;
# => $aa: 1 
my ($bb1, $bb2) = multiple_value;
# => $bb1: 1, $bb2: 'second value.'

perlでは、subの中で、どのようなコンテキストで呼出されているかを知る方法があります。

wantarray関数です。詳しくは以下。

wantarrayを使えば、リストコンテキストの場合とスカラーコンテキストの場合を区別して、戻り値を返却することができます。

http://d.hatena.ne.jp/perlcodesample/20080610/1213199380

この機能を使えば、単一の値を返す関数に2番目の戻り値を追加するという、多値風の拡張も可能です。でも、リストとスカラーの扱いまわりで混乱しそうだし、既にリストを返す関数に対しては使えない方法なので、実際に多値をシュミレートするためにwantarrayを使おうとは思いませんがw


ちょっと脱線

でも、下の例は、wantarrayを使わずにリストを返せば、いいような。リストをスカラー変数に代入すればリストの個数になるから。

wantarray ? return @ary : return scalar @ary; # 1

http://d.hatena.ne.jp/perlcodesample/20080610/1213199380

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください