職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

シンプルなアンケートを作る

2018年03月17日 | perl
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 <

集計結果



    END
    $i = 0;
    foreach (@ans) { print "
  • $_ : $n[$i++]\n"; } ←リストの項目を出力しています。
    print <

<form action="enquete-1.html">
<input type="submit" value=" 戻る ">
</form>\n</body>\n</html>
END

以上





コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« フォームデータの表示/perl | トップ | アンケート2-(サブルーチン編) »
最新の画像もっと見る

コメントを投稿

perl」カテゴリの最新記事