作者: 安田敏博FZH01112
日時: 2002/5/27(19:02)
極悪です。

勘違いしてるところがあるかもしれませんが、あまり調べずに書いちゃ
います。

@_ はどこからでも最初から定義済みの変数として見えるという意味でグ
ローバルですが、@_ が指しているものや保持している値は関数に出入り
する際に自動的に退避・復帰されます。つまり、local @_ 相当のことは
暗黙で行われているわけす。それをさらに明示的に local @_ するのは
変じゃないか、どういう意味があるのだろう、というのが第一の疑問で
す。

@_ は呼び出した側の変数のエイリアスになっているので、それをさらに
ローカライズした場合、呼び出し側への影響はどうなるのか?

もうひとつは、@_ の値は関数に出入りする際に退避・復帰されるので、
通常呼び出し側の @_ と干渉するはずないと思うのですが、今回のよう
に呼び出された側で local @_ とすると呼び出した側の @_ が壊れてし
まうのはなぜなのか? フィーリングですが、呼び出された関数の中で  
local @_ するということは、今回のような危険な結果になるのではなく
、安全側に傾く(外界への影響をなくす方向の)気がします。



例をあげると、下のスクリプトでは、utility の中で @_ を書き換えて
いるにも関わらず myfunc 内の @_ の値は常に hello になります(壊れ
ません)。これは local @_ 相当のことが自動的に行われてるからです
。

myfunc('hello');

sub myfunc{
    print "m1> @_\n";
    utility('tschus!');
    print "m2> @_\n";
}

sub utility{
    print "u1> @_\n";
    @_ = 'bye';
    print "u2> @_\n";
}

ところが utility 内で local @_ と書いてしまうと、myfunc が保持し
ている @_ の内容まで変わってしまいます(tschus になってしまう)。
これは不思議です。まさに

>>その例は,実際には,内容がなくなっているのではなく @_ に ()  が
>>代入されている状態です.

なわけですが、なんか直感的じゃないです。
--