[Perl] 関数の戻り値 その1

Posted by
ぴろり
Posted at
2011/11/30 12:05
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ

 Perl の関数(サブ ルーチン)の戻り値は、return ステートメントで明示するか、サブ ルーチンを抜けるときに最後に評価された値になります。じゃぁ、何も式を評価せずに関数を抜けたらどうなるの? という辺を中心にこちょこちょ実験してみたメモ。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

ソースコード その1

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
$, = $ = "
";

sub foo { }
print __LINE__, Dumper (foo);

sub bar { undef; }
print __LINE__, Dumper (bar);

sub baz1 { {} };
print __LINE__, Dumper (baz1);

sub baz2 { {{}} };
print __LINE__, Dumper (baz2);

sub baz2good { {+{}} };
print __LINE__, Dumper (baz2good);

sub baz2bad { +{{}} };
print __LINE__, Dumper (baz2bad);

実行結果

7
10
$VAR1 = undef;

13
$VAR1 = {};

16
$VAR1 = {};

19
$VAR1 = {};

Odd number of elements in anonymous hash at test1.pl line 21.
22
$VAR1 = {
          'HASH(0x1885170)' => undef
        };

 最初の foo 関数以外の戻り値は予想通り。ただ、foo 関数は、戻り値が undef でも空白でも何でもないということなのかな? ちょっと謎いので追試してみる。

ソースコード その2

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
$, = $ = "
";

sub foo { }
print __LINE__, Dumper ();
print __LINE__, Dumper (foo);
print __LINE__, Dumper (my $ret = foo);
print __LINE__, Dumper (my @ret = foo);

実行結果

7
8
9
$VAR1 = undef;

10

 7 行目と 8 行目、10 行目から見るに、Dumper に引数を何も与えなかった時と同じ挙動になっている。ただ、9 行目のように、スカラ変数に代入すると undef に変換されているみたいだ。もうちょっと追試してみる。

ソースコード その3

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
$, = $ = "
";

sub foo { }
print __LINE__, Dumper (foo);

sub bar { return (); }
print __LINE__, Dumper (bar);

my $ret = ();
print __LINE__, Dumper ($ret);

実行結果

7
10
13
$VAR1 = undef;

 foobar が同じ戻り値で、また、空のリストをスカラ変数に放り込んでみると undef になるのは、ソースコード その2の 9 行目と同じ。このことから、何も式を評価しない関数は、空のリストを返す関数と同じである、と考えていいのかな? Void Context なるものがあるらしいけれど、ちょっとこれ以上は追いかけられていない。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  


この記事のアーカイブ

全ての記事 »
2011年
全てのカテゴリ »
電算室 » 開発メモ
全てのタグ »
, ,

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。