作者: dune
日時: 2002/5/26(23:15)
極悪です。

@nifty の会議室で不思議な質問が出てました。自分の作った関数
の中から jcode::convert を呼ぶと @_ の中身が壊れるそうです。

壊れるスクリプトを見せて欲しいと思いますが、質問主さんは引数
が 20 個もある関数を作るほどのプロで、スクリプトの内容をあま
り細かくは書けないそうで・・・僕もどういうスクリプトを書いたら
どういうふうになったのかよくわかりません。断片的には

>  $jpn_title = "あいうえお";
>  &jcode::convert(*$jpn_title, 'jis');

とか書いてるようです。再現した、って書いてる人に少し聞き出し
てみましたが、例えば下のスクリプトを実行すると



%perl hoge3.pl
1> hello
2>

%



となって、確かに utility を呼ぶと myfunc から見えている @_ 
の内容がなくなります。何が起こっているのかわかりません。    
local @_ という書き方自体、僕は初めて見るのですが、これはど
ういう場合に使うのでしょうか? また、ある種の jcode.pl のバ
ージョンではこれと同じこと(utility の代わりに jcode::conver
t を呼び出しても、同様に呼び出した側の @_ の内容が壊れる)が
起こりうるのでしょうか? jcode.pl v2.6 と v2.13 では再現しま
せんでした。



--^ hoge3.pl
myfunc('hello');

sub myfunc{
	print "1> @_\n";
	utility();
	print "2> @_\n";
}

sub utility{
	local @_ = 'bye';
}
--$



# 実は関数の引数が 20 個ってのを読んだ時点で、「あぁ、それは
# バグだね」って思ったのですが、教えてもらった上の hoge3.pl 
# の動きは理解できないので侮れないなぁ、と思い直した次第。
-- 
FZH01112@..., http://www1.u-netsurf.ne.jp/~dune/