プロが教える店舗&オフィスのセキュリティ対策術

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

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

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

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

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

ご存知の方のお力添えいただければ幸いです。

A 回答 (2件)

 普通に、



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>";

---------------------------------------

補足日時:2001/10/25 18:05
    • good
    • 0
この回答へのお礼

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

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

これからもよろしくお願いいたします。

お礼日時:2001/10/25 21:17

> 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 やハッシュについての詳しい使い方などについては、参考書などを読んでみて下さい。
    • good
    • 0
この回答へのお礼

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

これからもよろしくお願いいたします。

お礼日時:2001/10/25 21:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!