アンケートプログラム

前回のprint.cgiを改造してアンケートプログラムを作成してみましょう。print.cgiをコピーしてenquete.cgiを作成します。連想配列%inにFORMタグの情報を格納するところまではそのまま使えます。HTMLとして出力する下半分を消して書き換えます。

(プログラム前半)

#!/usr/local/bin/perl

require "./cgi-lib.pl"; # cgi-lib.plライブラリ使用宣言

require "./jcode.pl"; # jcode.plライブラリ使用宣言

&ReadParse(%in);

foreach (%in) { # 連想配列のキーと値の数だけ繰り返し

	&jcode'convert(\$_, "sjis"); # 連想配列の各要素をsjisに変換

}

プログラムの後半では何をすればいいでしょう?まずは入力されたアンケートデータをCSV形式(データを「,」で区切った形式)でenq.csvファイルに追加保存するプログラムを作ってみましょう。

(プログラム後半)

# enq.csvファイルをファイルハンドルDATAで開く。失敗したらエラーメッセージを出して停止
open(DATA, ">>enq.csv") || die "File 'enq.csv' Open Error.";

# ファイルロック
# flock(DATA, 2);

$,=","; # print文の区切り文字を「,」に設定
print DATA %in,"\n";  # DATAに連想配列%inを書き出し

# ファイルロック解除
# flock(DATA, 8);

close(DATA);

&header; # HTMLヘッダー

print "<a href=\"enq.csv\">アンケート集計結果</a>\n";

&footer; # HTMLフッター

(略 HTMLのサブルーチン定義)

これだけでも一応FORMタグの入力をテキストファイルに保存することができます。ただし、入力データに改行があったり、「,」が使われているとおかしなことになります。また、csvファイルへのリンクだと更新ボタンを押しても新しい情報にならないので不便です。変更してみましょう。

変更その1 改行コードの削除

入力データから改行コードを削除します。文字列の置換(s///)を使って削除します。漢字コードの変換をしているforeachループに以下の行を追加してください。

s/[\n\r]//g; # 改行文字「\n」とリターン「\r」を除去

変更その2 「,」の変換

CSVデータにする場合には、元のデータに「,」が使われているとその部分でデータが二分されてしまいます。これを回避するために、元データの「,」を全角の「、」に変換します。その1と同様に漢字コードの変換をしているforeachループに以下の行を追加してください。

s/,/、/g; # 「,」と「、」を置換

変更その3 CSVファイルの出力

CSVファイルをHTMLのテーブルタグを用いて出力してみましょう。主な変更点は

です。プログラム後半部を以下のように置き換えてください。

# enq.csvファイルをファイルハンドルDATAで開く。失敗したらエラーメッセージを出して停止
open(DATA, "+<enq.csv") || die "File 'enq.csv' Open Error.";

# ファイルロック
# flock(DATA, 2);

seek (DATA, 0, 2); # ファイルハンドルDATAの末尾にファイルポインタを移動

$,=","; # プリント文の区切り文字を「,」に
print DATA %in,"\n";  # DATAに連想配列%inを書き出し

seek (DATA, 0, 0); # ファイルハンドルDATAの先頭にファイルポインタを移動

@txt=<DATA>; # ファイルの内容を配列@txtに読み込み

# ファイルロック解除
# flock(DATA, 8);

close(DATA);

&header; # HTMLヘッダー

print "<table border=\"1\">\n"; # <table>タグ出力
foreach (@txt) { # 配列@txtの要素だけ繰り返し

	@array=split(',',$_); # 配列@txtの要素(ファイルの一行)を「,」で区切って配列@arrayに格納
	print "<tr>\n"; # <tr>タグ出力
	foreach $item (@array) { # 配列@arrayの要素だけ繰り返し

		print "<td>$item</td>\n"; # データの各項目を<td>タグをつけて出力

	}
	print "</tr>\n"; # <tr>終了タグ出力
}
print "</table>\n"; # <table>終了タグ出力

&footer; # HTMLフッター

(略 HTMLのサブルーチン定義)

enquete.cgi 全コード