Perlでシンプルなアンケート作る
【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3
Perlは既にインストール済み
CGIを使用する時は、必ずApachを起動する
【アンケート】
仕様
1.質問「犬と猫のどちらが好き?」に対して、相手に回答してもらう。
2.回答は「犬」、「猫」、「どちらも嫌い」 の何れかをチェックする形式。
3.各項目の集結が出来るようにする。
画面操作
1.初期画面
2.選択し、「回答」ボタンを押す
3.回答画面
「戻る」ボタンを押して、初期画面に戻る
4.初期画面から、「集計の表示」ボタンを押す
5.アンケート集計が表示される
【アンケートスクリプト】
1)アンケートの質問を表示する画面「enquete-1.html」
ⅰ.最初のフォーム<form action="enquete-2.cgi" method="post">~</form>は、質問に対する回答データを「enquete-2.cgi」に対して送り出すフォーム
ii.このフォームには3つのラジオボタンがあり、16行目の「回答する」と表示された submitボタンを押すと、「犬」を選んだときは ans=0 というデータがpostで送信される。
iii.リスト<ul><li type="disc"><li> ~ </li><ul>は、先頭に「・」を付け、チェックボタンとデータを縦に並べる。
ⅳ.<form action="enquete-3.cgi" >~</form>は「集計の表示」 ボタンと、その処理を委ねるスクリプトを指し示している。
2)回答画面「enquete-2.cgi」
ⅰ.「$datafile = 'enquete.dat';」はデータを入れるファイルの指定。
「@ans =('犬', '猫', 'どちらも嫌い'); は質問項目を要素の初期化。
ⅱ.$in{$key} = $valの解説
#---- フォームデータ取得 ----
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
・・・・・・
}else{
・・・・・・・
}
以上までは前回説明済み
foreach (split(/&/, $buf)) {
・・・・
$in{$key} = $val;→ハッシュの生成
}
例えば、「犬」 が選ばれ「 ans=0 」というデータが送られてきた場合、ハッシュ %in にキーを ans、その値 $in{'ans'} を0とする要素が設定される。
ⅲ.exists 関数
#---- 回答の計数 ----
if (exists $in{'ans'}) {
・・・・
}else{
$msg = "どれかを選んでからお答えください";
}
exists 関数でハッシュ値$in{'ans'}の有無を調べる。→なぜなら、アンケートの質問画面でどの項目も選ばないと、ans データ無しでこのCGI が起動しないからである。そして、選択されて無い時は、"どれかを選んでからお答えください"の表示を出す。
ⅳ.ファイルテスト演算子 -e
if (-e $datafile) {
・・・・・・・・
}
ファイルテスト演算子 -e を使って $datafile が存在するかどうかを調べています。$datafile が存在すれば、このファイルの内容を読み取む。
ⅴ.open関数
if (-e $datafile) {
pen(IN, $datafile);
・・・・
}
標準ファイルハンドル以外を使う場合には、open関数を使用します。そして、open関数を使って、読み込みモードでファイルを開かせる。
構文
→open(ファイルハンドル名, "ファイル名")
ⅵ.ファイル読み込みwhile文
ファイルからテキストデータを読み込む時、while (<IN>) を使うのが便利である。また、while (<IN>)は while(defined($_ = <TXT>)) と同じで、$_ にファイルハンドル<IN> から1行読み込んだ値がセットされる。行入力演算子<>はファイルの終端に来ると、未定義を返す。
while (<IN>) {
chomp;→改行文字だけを削除する。
push(@n, $_);→$_に入ってるファイルデータを配列(@n)に入れる
}
#クローズ
close(IN);
}else{ @n = (0, 0, 0); $new=1; }→ファイルが無い時、配列@nに0を入れる
ⅶ.データ
$i = $in{'ans'};#変数←値
$n[$i]++;
回答された ans の値 $in{'ans'} を $i に代入し、データの配列 @n の $i 番目の要素 $n[$i] をインクレメント(1を加算)する
ⅷ.ファイルへの書き出し
open(OUT, ">$datafile");
→「enquete.dat」ファイルを出力モードでオープンする。
foreach (@n){print OUT "$_\n";}
→更新された配列 @n のデータが変数$_に入り、ファイルハンドルOUTが示す$datafileに書き出す。
close(OUT);→ファイルを閉じる
■オープンモード
ⅸ.ファイルのパーミッション変更
if ($new) { chmod(0666, $datafile); }
→この書き出しで新規にファイルが作られたときは、パーミッションですべてのユーザーにファイルの書込権限を与えている。
$msg = "あなたは 「$ans[$i]」 の$n[$i]人目です";
→例えば、 "あなたは 「犬」 の5番目です" というようなメッセージを設定している。
} else {
$msg = "どれかを選んでからお答えください";
}
Ⅹ.結果表示
#---- 回答の表示 ----
print <
ご回答の表\示
$msg
<form action="enquete-1.html"> ←フォームを使って入力画面に戻る
<input type="submit" value=" 戻る ">
</form>\n</body>\n</html>
END
3)アンケート集計画面「enquete-3.cgi 」
#!/usr/local/bin/perl
$datafile = 'enquete.dat';←データファイル名の設定
@ans = ('犬', '猫', 'どちらも嫌い');←質問項目を要素とする配列の設定
#---- データ読み取り ----
if (-e $datafile) {
open(IN, $datafile);
while (<IN>) {
chomp;
push(@n, $_);
}
close(IN);
} else { @n = (0, 0, 0); }
ここまでは、回答画面の処理と同じで、$datafileを読み取る処理をしている。
#---- 集計の表示 ----
print <
集計結果
- $_ : $n[$i++]\n"; } ←リストの項目を出力しています。
print <
END
$i = 0;
foreach (@ans) { print "
<form action="enquete-1.html">
<input type="submit" value=" 戻る ">
</form>\n</body>\n</html>
END
以上