こんにちは。tyabudaiと申します。
アンケート(投票)のCGIを
作成しようと思っています。
ログの中身は、(とりあえずカンマ区切りで)
「項目,数値」です。
処理のイメージとしては、
まずログファイルの内容を、
「項目」をキーとしたハッシュに取り込みます。
投票があった場合、
「項目」をキーとして「数値」を取り出し、
1つ増加させる処理をしたいです。
現在、他サイト様よりCGIをダウンロードして
そのような処理がないか探していますが、
全く手がかりがありません。
まずは、ログファイルの内容をハッシュに取り込む方法を
お教えいただけないでしょうか。
ご存知の方のお力添えいただければ幸いです。
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 やハッシュについての詳しい使い方などについては、参考書などを読んでみて下さい。
No.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>";
---------------------------------------
回答いただきありがとうございました。
知識不足のためご教示いただいた内容を
理解するのに時間がかかってしまいました。
これからもよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
一意(ユニーク)かつ、ソート...
-
チェックデジットについて
-
英語でのシャープとコメの呼び...
-
Perlでの文字変換(置換)について
-
ハッシュ検索はなぜ速い
-
perl 文字列検索後に指定フィー...
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
クラスに配列を渡す方法
-
VBA Dir関数でファイルをループ...
-
VBのReturnの使い方
-
スレッド起動したフォームを正...
-
ボタンが押された時にループか...
-
objective-cの多重ループbreak
-
リストボックスに縦スクロール...
-
スリザーリンクの問題をランダ...
-
UWSCの終了の仕方
-
【VBA】全て空白のセルの列の非...
-
VB ループ中の値をゆっくり出力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
チェックデジットについて
-
perl 文字列検索後に指定フィー...
-
perlで配列名を動的に作り出したい
-
列挙型と連想配列の違いを教え...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
動的なハッシュの配列を作成したい
-
多次元連想配列の削除
-
多次元配列から重複を削除
-
ハッシュリストって単にハッシ...
-
ハッシュ値が一致したデータは...
-
まったく同じファイルのハッシ...
-
*(アスタリスク)の意味
-
ハッシュマーク以降のアドレス取得
-
Perlのサブルーチンの引数に配...
-
UTF-8で書かれたJSPの日本語文...
-
連想配列のサイズ制限
-
Perlは戻り値で、ハッシュや配...
おすすめ情報