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

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.