Perl の関数(サブ ルーチン)の戻り値は、return ステートメントで明示するか、サブ ルーチンを抜けるときに最後に評価された値になります。じゃぁ、何も式を評価せずに関数を抜けたらどうなるの? という辺を中心にこちょこちょ実験してみたメモ。
#!/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 でも空白でも何でもないということなのかな? ちょっと謎いので追試してみる。
#!/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 に変換されているみたいだ。もうちょっと追試してみる。
#!/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;
foo と bar が同じ戻り値で、また、空のリストをスカラ変数に放り込んでみると undef になるのは、ソースコード その2の 9 行目と同じ。このことから、何も式を評価しない関数は、空のリストを返す関数と同じである、と考えていいのかな? Void Context なるものがあるらしいけれど、ちょっとこれ以上は追いかけられていない。