bonar note

京都のエンジニア bonar の技術的なことや技術的でない日常のブログです。

なぜchopは値渡しで変数の内容を変えられるのか

これ多分perl使ってる人には常識なんでしょうが、僕は最近まで、「なんでchopは値渡しで渡した変数の内容を勝手に変更できるんだろう?」と疑問に思ってたんです。


だって不思議じゃないですか?

$str = chop($str);


で$strの内容が変更されるならわかるんです。値を渡して、chop関数が最後の1文字を切り取って返して、それがまた$strに入ると。すごく自然なのですが、chopは

chop($str);

だけで$strの内容を変更できます。chop(\$str)でもなく chop($str)で変更してしまうんです。これって微妙にびっくりな挙動だと思うのは僕だけでしょうか。。。


でもこれと似たようなことは以下のコードで再現できます。

#!/usr/bin/perl

use strict;

sub square {
    $_[0] *= $_[0];
}

my $foo = 23;
square($foo);

printf("foo=[%d]\n", $foo);

実行結果は「foo=[529]」で、$fooの内容が思いっきりか気変わります。つまり@_の内容を書き換えることで渡した変数の内容をかえる事ができるわけです。こういったコードがかける以上、値渡し(本当に値渡し?)でも油断できませんね。。


なんでこういう実装になっているのか勉強不足でよくわからないのですが、ちょっと驚いたのでメモ。