簡易アンケートを作ってみる

トップ > プログラミング研究 > 簡易アンケート
一つ前にもどる 目次にもどる 次のページへ

簡易アンケート - 入力内容を保存・表示する

前回で解説したようなプログラムならJavaScriptで出来てしまいます。ですから、次はそれだけでは出来ないようなものをサンプルとして取り上げます。「カウンター」の応用編のようですが、アンケート集計です。

■アンケート調査です。
賛成:
反対:

今回も、とりあえずソースを見てみたいと思います。(ただ、ずいぶん長いソースになってきました・・・)

01: #!/usr/local/bin/perl
02:
03: require 'jcode.pl';
04:
05: &read_data;
06:
07: # count.datというファイルから現在のカウント数を読み込む
08: open (IN, "quest.dat");
09: @count=<IN>;
00: close(IN);
11:
12: # 改行コードを取り除く
13: chomp @count;
14:
15: # 現在のカウント数$countに1を追加
16: if ($FORM{'ans'} eq "yes"){ $count[0]++;}
17: elsif ( $FORM{'ans'} eq "no"){$count[1]++;}
18:
19: # print以外でもヒアドキュメントは使えるんです。便利!
20: $newdata = <<"DATA";
21: $count[0]
22: $count[1]
23: DATA
24:
25: # 1増加したカウントを保存
26: open (OUT, ">quest.dat");
27: print OUT $newdata;
28: close(OUT);
29:
30: # ここからHTMLでの表示
31: print <<"HTML";
32: Content-Type: text/html
33:
34: <html><head><title>test</title></head>
35: <body>
36: アンケート結果<br>
37: 賛成 : $count[0] 人<br>
38: 反対 : $count[1] 人<br>
39: </body></html>
40: HTML
41:
42: # サブルーチン化された読み込み処理
43: sub read_data(){
44:   if ($ENV{'REQUEST_METHOD'} eq "POST") {
45:     read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
46:   } else {
47:     $buffer = $ENV{'QUERY_STRING'};
48:   }
49:   foreach (split(/&/, $buffer)) {
50:     ($keyword, $value) = split(/=/);
51:     $value =~ tr/+/ /;
52:     $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
53:
54:     # S-JISコード変換
55:     &jcode'convert(*value, "sjis", "", "z");
56:
57:     $value =~ s/\r//g;
58:     $value =~ s/\n//g;
59:
60:     $FORM{$keyword} = $value;
61:   }
62: }
63: __END__

簡易アンケート・プログラムソースの解説

共通の処理をサブルーチン化する

まず、最初の例との違いですが、入力されたデータを処理する部分をサブルーチン化しています。下の「&read_data;」というのは「read_data」という名前のサブルーチンの処理をしなさい、というPerlの命令です。

01: #!/usr/local/bin/perl
02:
03: require 'jcode.pl';
04:
05: &read_data;


43: sub read_data(){
44:   if ($ENV{'REQUEST_METHOD'} eq "POST") {
45:     read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    ・・・
60:     $FORM{$keyword} = $value;
61:   }
62: }

5行目でそのように書くことで、今度は43行~62行(茶色の部分)を実行するような命令になります。Perlでは「&***」でサブルーチンを呼び出し、「sub ***{}」でサブルーチンの処理を定義しています。

ですから、このようによく使う命令群をサブルーチン化することで、効率よくプログラムを書くことが出来ます。(これはPerlに限ったことではないですが・・・)

ファイルからデータの読み込み

次に、アンケートデータを保存してあるファイルからデータを読み出します。このとき、「@count」という配列に読み込みます。テキストデータだと各行が配列の要素に一致します。「$count[0]⇒1行目、$count[1]⇒2行目、$count[2]⇒3行目」というようにです。

08: open (IN, "quest.dat");
09: @count=<IN>;
00: close(IN);
11:
12: # 改行コードを取り除く
13: chomp @count;

ですが、各要素の末尾には改行コードがついていて、処理するには不具合があるので13行目の「chomp」という命令で改行コードを取り除いています。

あとは、「yes」か「no」かで、集計処理を分けて最終的にそれを保存して終了、という処理になります。

15: # 現在のカウント数$countに1を追加
16: if ($FORM{'ans'} eq "yes"){ $count[0]++;}
17: elsif ( $FORM{'ans'} eq "no"){$count[1]++;}

書き込みをする条件を入力してもらうという点を除けば、基本的にはカウンターと同じ処理だと思います。簡単ですよね。これで入力データの処理について理解してもらえたでしょうか??

一つ前にもどる 目次にもどる 次のページへ
(作成2004/02/05 by あいまい)

トップ > プログラミング研究 > 簡易アンケート

日時: 2008年01月25日 14:12
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク
トップに戻る
このエントリーの所属カテゴリ: プログラミング研究
このエントリーのタイトル:簡易アンケートを作ってみる



copyright © 2000-2008 all rights reserved
あいまいモード・コム - rss2.0 atom
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク