• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:関数内で同じ事を繰り返すと、2回目の値が1回目のコピーになってしまう事について)

関数内で同じ事を繰り返すと、2回目の値が1回目のコピーになってしまう事について

このQ&Aのポイント
  • 関数内で同じ処理を繰り返すと、2回目の値が1回目のコピーになる現象が起こります。
  • この現象は、変数のスコープの問題によるものです。
  • 関数内で変数を使う場合、その変数のスコープを明示的に指定する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

??? どのような環境でしょう。 Windows XP ActivePerl v5.8.8 built for MSWin32-x86-multi-thread の環境で実行しましたが、質問の現象を再現できませんでした。 下記コードを実行した結果です(リストは3つずつ)。 --- start --- $#list=2 @list=1 2 3 あああ,18(pass=1234) いいい,28(pass=2234) ううう,38(pass=3234) $#listA=2 @listA=21 22 23 かかか,218(pass=21234) ききき,228(pass=22234) くくく,238(pass=23234) --- end --- ========================================================================== print "--- start ---\n"; &Test(); print "--- end ---\n"; sub Test { #■hoge1内の情報を参照 opendir(DIR, "/tmp/hoge1/data/"); @list = sort{$a <=> $b} grep(/\d$/, readdir DIR); closedir(DIR); print "\$\#list=$#list\n"; print "\@list=@list\n"; foreach $_ (@list) { #hoge1...test/ require "/tmp/hoge1/data/$_/$_.log";#中身は右記のような形で1行です。$pass = '1234'; $Name = 'あああ';1; require "/tmp/hoge1/data/$_/no.dat";#中身は右記の1行です。$No = '18';1; print "$Name,$No(pass=$pass)\n"; } print "\n"; #■hoge2内の情報を参照 opendir(DIR2, "/tmp/hoge2/data/"); @listA = sort{$a <=> $b} grep(/\d$/, readdir DIR2); closedir(DIR2); print "\$\#listA=$#listA\n"; print "\@listA=@listA\n"; foreach $_ (@listA) { require "/tmp/hoge2/data/$_/$_.log";#中身は右記のような形で1行です。$pass = 'aaaa'; $Name = 'いいい';1; require "/tmp/hoge2/data/$_/no.dat";#中身は右記の1行です。$No = '18';1; print "$Name,$No(pass=$pass)\n"; } }

taku0
質問者

お礼

解決しました。 質問する際、色々な前提条件を取り払い簡単かつポイントを絞りhoge1とhoge2という形に置き換えて質問させてもらってたのですが、原因はスクリプト内で質問内容でいうと双方ともhoge1を読み込んでいた為でした。 具体的には、下記のように出力先を2箇所という形にしており sub Test{ #■処理1 if($a eq 'a'){ open(OUT,">/tmp/hoge2/data/a.txt"); }else{ open(OUT,">/tmp/hoge2/data/x.txt"); } if($a eq 'a'){ #ここに質問内容 }else{ #同様にここにも質問内容 } #■処理2 if($a eq 'a'){ open(OUT,">/tmp/hoge2/data/b.txt"); }else{ open(OUT,">/tmp/hoge2/data/y.txt"); } if($a eq 'a'){ #ここに質問内容 }else{ #同様にここにも質問内容 } } 上記のですと処理1と処理2共$a eq 'a'の場合は同じ所を読み込むようになり、 今回のようなケースに陥ってしっていたようです。 で、読み込み元を別にすれば出力時には質問内容のようなエラーにはならない事も確認でき、原因がわかったので出力先を2箇所にする事も何とか解決できそうです。 有難うございました。