Perl の戻り値はコピーになる?
Perl のリファレンスの機能を使ってサンプルコードを書いてみた。
use strict; sub foo { my @a = (0, 1, 2, 3); print "a = " . \@a . "\n"; return @a; } my @x = foo(); print "x = " . \@x . "\n"; print "x[1] = " . $x[1] . "\n"; sub bar { my @b = (0, 1, 2, 3); print "b = " . \@b . "\n"; return \@b; } my $y = bar(); print "y = " . $y . "\n"; print "y[1] = " . $y->[1] . "\n";
すると結果はこうなる。
a = ARRAY(0x177530c) x = ARRAY(0x1771b48) x[1] = 1 b = ARRAY(0x176fc44) y = ARRAY(0x176fc44) y[1] = 1
要は、サブルーチン foo の内部で生成した配列を、普通に return でサブルーチンの外に返すと、どこかの段階でコピーが作られてしまう(a と x の値が違うことからそれが分かる)。これは処理速度的に問題があると思うがなぜこんな仕様なのだろうか。
サブルーチン bar のようにリファレンスで返せば大丈夫のようだ(b と y の値が同じなので)。しかし、これだといちいちリファレンスであることを、返す側も返される側も意識する必要があり面倒だ。C(や C++)でも、これと似たようなことがあったと記憶している。