localがすごい件

教えてもらったことを忘れる前に書く。

C:\>perl -e "$a = {x=>0}; {$a->{x} = 1; print $a->{x};} print $a->{x};"
11

C:\>perl -e "$a = {x=>0}; {my $a->{x} = 1; print $a->{x};} print $a->{x};"
Can't use an undefined value as a HASH reference at -e line 1.

C:\>perl -e "$a = {x=>0}; {local $a->{x} = 1; print $a->{x};} print $a->{x};"
10

local $a = ...でスコープを抜けると$aが元の値に戻るとかならまだわかるけども、ハッシュに書き込んだものまで元に戻るとは!

        • -

追記。ブロックの中で$a->{y}がちゃんと取得できていることに注目。

C:\>perl -e "$a = {x=>0, y=>1}; {local $a->{x}=2; print $a->{y}} print $a->{x};"
10
        • -

Youchan 2008/02/21 08:33 値が元に戻るというよりも、別の領域を指している変数なのではないでしょうか?
元に戻るという表現にちょっと違和感を感じる

もちろん一般的には変数の値がスコープを抜けたときに元の値に戻るように見えるのはその通りの理由なんですけど、このエントリーの重点は「ハッシュの破壊的書き換えに見えるものまで元に戻る(ように見える)ぞ!!」ということなのですよ。そういう挙動がなぜ起きるかって話ならもちろん「local $a->{x} = 1;」の時点で$aが別の領域を指すようになってるんだと思いますよ。しかし丸ごとコピーするのかなぁ。それともキーが見つからなかったときだけ元の$aを参照しに行くような形になっているのかなぁ。