• ベストアンサー

投票データをハッシュを使用して入出力する

こんにちは。tyabudaiと申します。 アンケート(投票)のCGIを 作成しようと思っています。 ログの中身は、(とりあえずカンマ区切りで) 「項目,数値」です。 処理のイメージとしては、 まずログファイルの内容を、 「項目」をキーとしたハッシュに取り込みます。 投票があった場合、 「項目」をキーとして「数値」を取り出し、 1つ増加させる処理をしたいです。 現在、他サイト様よりCGIをダウンロードして そのような処理がないか探していますが、 全く手がかりがありません。 まずは、ログファイルの内容をハッシュに取り込む方法を お教えいただけないでしょうか。 ご存知の方のお力添えいただければ幸いです。

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.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 やハッシュについての詳しい使い方などについては、参考書などを読んでみて下さい。

tyabudai
質問者

お礼

丁寧な解説ありがとうございます。 ようやく理解することができました。 大変助かりました。 これからもよろしくお願いいたします。

その他の回答 (1)

noname#25358
noname#25358
回答No.1

 普通に、 open(IN, "<..."); while(<IN>) {   ($key,$val)=split(/,/,$_);   $hash{$key}=$val; } close(IN);  とするのは駄目なんでしょうか?  このテクニックは方々で使われているものです。

tyabudai
質問者

お礼

回答いただきありがとうございました。 知識不足のためご教示いただいた内容を 理解するのに時間がかかってしまいました。 これからもよろしくお願いいたします。

tyabudai
質問者

補足

ありがとうございます。 練習で以下のような処理を組んでみたのですが、 うまく表示されません。 ログファイル: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>"; ---------------------------------------

関連するQ&A