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 なるものがあるらしいけれど、ちょっとこれ以上は追いかけられていない。