最近、こつこつPerlを学んでいるのであるが、僕が学んでいる情報元に、関数呼び出しは値渡しだって書かれていた。
Arguments are passed by value. They are copied to the default list variable (@_) where a subroutine can then access it.
ほんとに?Perlではリストとかハッシュとかガンガン使うのに値をコピーしちゃうの?うそでしょ?そんなんじゃスタックにメモリーがいくらあっても足りないじゃん。そこで、下記コードを書いてみた。
#!/usr/bin/perl
# To check if perl pass by value or reference when call subrutine
sub func{
$_[0] = 2008;
$_[1] = “Web 2.0”
}
my $number = 2007;
my $string = “Web 1.0”;
print “before $number & $string\n”;
func($number, $string);
print “after $number & $string\n”;
出力結果
before 2007 & Web 1.0
after 2008 & Web 2.0
この結果が示す通り参照渡である。
ではなぜPerlは値渡しだと言われるのだろう?少しネットで調べてみた。
関数方で、呼ばれるとすぐに
my ($abc, $def, …..) = @_;
のように、引数をローカルの変数にコピーするのが一般的なので、Perlは値渡しだと言われるらしい。
Perlには変数の前に(\)を付けてリファレンスを取得する事ができるようだ。
$string_ref = \$string;
ここは今学習中。
dankogaiさんが丁寧に説明して下さっています。
404 Blog Not Found perl – 暗黙的な参照 # @_ と $_