- ベストアンサー
投票データをハッシュを使用して入出力する
こんにちは。tyabudaiと申します。 アンケート(投票)のCGIを 作成しようと思っています。 ログの中身は、(とりあえずカンマ区切りで) 「項目,数値」です。 処理のイメージとしては、 まずログファイルの内容を、 「項目」をキーとしたハッシュに取り込みます。 投票があった場合、 「項目」をキーとして「数値」を取り出し、 1つ増加させる処理をしたいです。 現在、他サイト様よりCGIをダウンロードして そのような処理がないか探していますが、 全く手がかりがありません。 まずは、ログファイルの内容をハッシュに取り込む方法を お教えいただけないでしょうか。 ご存知の方のお力添えいただければ幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> foreach (%hash) > { > print << "END"; > $key は $hash{$key} > <BR> > END > } ここが違います。正しくはこうなります。 foreach (keys %hash) { print << "END"; $_ は $hash{$_} <BR> END } なぜ最後のデータが表示されるのかというと、 > $key は $hash{$key} での $key には、 > while(<IN>) { > ($key,$val)=split(/,/,$_); > $hash{$key}=$val; > } で最後に参照した「ううう」が入っているため、毎回 $hash{'ううう'} が表示されるからです。 また、なぜ6回表示されるのかというと、これは %hash を > foreach (%hash) で、リストとして評価しているため、('あああ',2,'いいい',5,'ううう',10)というリストの要素の数(6個)分だけループするからです。 foreach やハッシュについての詳しい使い方などについては、参考書などを読んでみて下さい。
その他の回答 (1)
普通に、 open(IN, "<..."); while(<IN>) { ($key,$val)=split(/,/,$_); $hash{$key}=$val; } close(IN); とするのは駄目なんでしょうか? このテクニックは方々で使われているものです。
お礼
回答いただきありがとうございました。 知識不足のためご教示いただいた内容を 理解するのに時間がかかってしまいました。 これからもよろしくお願いいたします。
補足
ありがとうございます。 練習で以下のような処理を組んでみたのですが、 うまく表示されません。 ログファイル:count.dat に、 あああ,2 いいい,5 ううう,10 というデータを書いてみました。 しかし、実行してみると ううう は 10 が6回表示されます。 これはどこが間違っているのでしょうか? なぜ最後のデータを 6回繰り返すのかわかりません。 申し訳ないですがお教えいただけないでしょうか。 以下サンプル -------------------------------------- #!C:/Perl/bin/perl # ハッシュの練習です $file = "count.dat"; print "Content-type: text/html\n\n"; print << "END_HTML"; <HTML> <HEAD> <TITLE>TEST</TITLE> </HEAD> <BODY> ハッシュのテストです。<BR> END_HTML open(IN, "<$file") || die "Can't open $file"; while(<IN>) { ($key,$val)=split(/,/,$_); $hash{$key}=$val; } close(IN); # 全てのデータについて繰り返す foreach (%hash) { print << "END"; $key は $hash{$key} <BR> END } print "</BODY></HTML>"; ---------------------------------------
お礼
丁寧な解説ありがとうございます。 ようやく理解することができました。 大変助かりました。 これからもよろしくお願いいたします。