OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.157063
  • 閲覧数54
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 53% (8/15)

こんにちは。tyabudaiと申します。

アンケート(投票)のCGIを
作成しようと思っています。

ログの中身は、(とりあえずカンマ区切りで)
「項目,数値」です。
処理のイメージとしては、
まずログファイルの内容を、
「項目」をキーとしたハッシュに取り込みます。
投票があった場合、
「項目」をキーとして「数値」を取り出し、
1つ増加させる処理をしたいです。

現在、他サイト様よりCGIをダウンロードして
そのような処理がないか探していますが、
全く手がかりがありません。

まずは、ログファイルの内容をハッシュに取り込む方法を
お教えいただけないでしょうか。

ご存知の方のお力添えいただければ幸いです。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル12

ベストアンサー率 75% (398/526)

> 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

お礼率 53% (8/15)

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

これからもよろしくお願いいたします。
投稿日時 - 2001-10-25 21:13:34
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1

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

open(IN, "<...");
while(<IN>) {
  ($key,$val)=split(/,/,$_);
  $hash{$key}=$val;
}
close(IN);

 とするのは駄目なんでしょうか?
 このテクニックは方々で使われているものです。
補足コメント
tyabudai

お礼率 53% (8/15)

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

---------------------------------------
投稿日時 - 2001-10-25 18:05:20
お礼コメント
tyabudai

お礼率 53% (8/15)

回答いただきありがとうございました。

知識不足のためご教示いただいた内容を
理解するのに時間がかかってしまいました。

これからもよろしくお願いいたします。
投稿日時 - 2001-10-25 21:17:02


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ