Perl: 関数呼び出しは値渡し or 参照渡し?

最近、こつこつ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 – 暗黙的な参照 # @_ と $_

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s