カレッヂ |
質問者 rescue
投稿日 5/30(金) 23:28:38
いつもお世話になってます。 私が何か勘違いしているのかわかりませんが、ちょっと変な現象が起きているので、 分かる方ご指摘いただければ幸いです。 opendir(DIR,$base); @list = readdir(DIR); close(DIR); @test1 = @list; foreach $file (@list) { push(@test2,$file); } あるフォルダ一覧を取得し、ループの前 @test1 と、ループ中 @test2 は同一の 値が入ると思うのですが、何故か @test2 には、@test1 の値をちょうど2回 繰り返しの値が表示されてしまうのです。 例 @test1 -------------- . .. 123 456 789 -------------- @test2 -------------- . .. 123 456 789 . .. 123 456 789 --------------- 何か検討違いな思いをしているのか、解決しないので、 よろしくおねがいします。
プロバイダ参照: |
回答者 やまだ
[削除]
投稿日 5/31(土) 00:07:48
別におかしいところは、ないと思うのですが、表示(確認)の部分はどうなかんじでしょうか? |
回答者 domo
[削除]
投稿日 5/31(土) 00:55:16
#!/usr/bin/perl -w $base = './'; my (@test1,@test2,@list);# ----- 初期化 opendir(DIR,$base); @list = readdir(DIR); close(DIR); @test1 = @list; foreach $file (@list) { push(@test2,$file); } print "Content-type: text/html\n\n"; print "<pre>"; print join("\n",(@list,"-------",@test1,"-------",@test2)); print "</pre>"; -- 以上のコードをCGIとして実行しましたが、すべて配列が同じ値で表示されました。 私も特に問題ないと思います。 FreeBSD + Apache 1.3.27 + Perl5.00503 |
質問者 rescue
[削除]
投稿日 5/31(土) 11:03:02
アドバイスありがとうございます。 質問に書いたのは要旨を書いたので、 もちろんすべての変数や配列は念の為直前に初期化していますし、 局所変数にしたりしていますが、それでも何故か @test1 ≠ @test2 で 同じ値にならないので「おかしい」と思ったのです。 さらに変なのは、なる時とならない時があるということです。 プログラム上での理論としては同じ値のはずだと思うので、 どうしてこんなことが起きるのか、 Perlのバグなのか、何か知っている情報があったらと思ったものでした。 いまは現実対策として、だぶった値を避けるように 無理やりこうすることにして結果オーライ的な処理にしてみました。 opendir(DIR,$base); @list = readdir(DIR); close(DIR); @test1 = @list; foreach $file (@list) { if ($CHECK{$file}) { next; } # <対策 $CHECK{$file} = 1; # <対策 push(@test2,$file); } とりあえず、私の勘違いではなかったことが分かっただけでも 先にすすめそうです。ありがとうございました。 |
返信(回答)する
Web裏技 |