さだぼう
[E-Mail]
2000/02/15(火) 11:40:36
perl5で,ある条件を満たすときに配列を書きなおして,
条件にあうものに変える処理をするために
概略として次の形になるサブルーチンを書きました。
@aはlocalやmyの宣言をしていない変数です。
sub sub1{
my @n_a = @a;
sub new {@a = @n_a}
loop: for ($i=0; $i<=$#a; $i++) {
push(@n_a, shift(@n_a));
$c=&sub2(@n_a,@a);
if ($c>0) {&new; next loop}
elsif($c<0){next loop}
$d=&sub3(@n_a,@a);
if ($d>0) {&new; next loop}
elsif($d<0){next loop}
}
}
しかし場合によって,@aが@n_aで書きなおされたり
書きなおされなかったりで,動作が怪しくなりました。
結局myをlocalにして解決したのですが,
質問としては,この場合,@n_aはサブルーチンnewの
中から参照されているのでしょうか,いないのでしょうか。
青ラクダ本には,myは「取り囲む一番内側のブロック,サブルーチン,
(中略)の中でのみ存在されることを意味する」とあります。
これを私は,@n_aがnewを含むsub1内で使える,と解釈したのですが,
本当はどうなのでしょうか。よろしくお願いします。
さだひろ
[HomePage]
2000/02/15(火) 19:16:25
質問者です。メインルーチンから呼ぶとmyでも動いた
のに,別のサブルーチンから呼ぶと&newは確かに呼び出されて
いたのに,@aは書き換わらなかったのです。
localを使えば済んだ話なのですが,
サブルーチンの中のサブルーチンというものの扱いがイマイチ
分からないのでそこを含めて解説していただけたらうれしいです.