CGI-BBS > CGI > Perl > Perlについて不思議な現象が起きている?


カレッヂ
カレッヂ


質問者 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
---------------

何か検討違いな思いをしているのか、解決しないので、
よろしくおねがいします。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:Win95系
エディタ:
FTPソフト:
サーバ移転:していない
改造:(未選択)
CGI習熟度:(未選択)

回答者 やまだ  [削除]  投稿日 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裏技