簡易アンケート - 入力内容を保存・表示する
前回で解説したようなプログラムなら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]++;}
書き込みをする条件を入力してもらうという点を除けば、基本的にはカウンターと同じ処理だと思います。簡単ですよね。これで入力データの処理について理解してもらえたでしょうか??





