占いプログラムを作る - CGI(Perl)の基本と掲示板作成
目次
占いプログラム
前回のプログラムをふまえて、占いプログラムを作ってみましょう。今回新たに学ぶこと
- 複数のフォーム部品の処理
- 条件分岐
フォームのHTML
前回と同じように、最初にフォームの入ったHTMLファイルを作成します。以下のHTMLをテキストエディタで入力してください。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>占いの館</title>
</head>
<body>
<h2>占いの館</h2>
<form method="post" action="uranai.cgi">
名前:
<input type="text" name="namae" size="20">
<br>
性別:
<input type="radio" name="seibetsu" value="男" checked>男
<input type="radio" name="seibetsu" value="女">女
<br>
誕生月:
<input type="text" name="month" size="2">月
<br>
<input type="submit" value="送信">
</form>
</body>
</html>
入力が終わったら、「uranai.html」という名前でサーバにアップロードし、ブラウザで確認してみてください。テキスト入力フィールド・ラジオボタン(丸い選択ボタン)・送信ボタンが表示されると思います。HTMLの説明
前回と同じく、<form>~</form>に挟まれたフォーム部品の内容が、action属性に書かれたCGI(uranai.cgi)に送られます。
<input type="text" name="namae" size="20">
前回と同じく、namaeという名前のテキスト入力フィールドを配置します。size属性は、横幅が半角何文字分になるかを指定する部分ですが、あまり正確ではないので目安程度に考えてください。
<input type="radio" name="seibetsu" value="男" checked>男
<input type="radio" name="seibetsu" value="女">女
seibetsuという名前のラジオボタンを配置します。type属性が「radio」のフォーム部品はラジオボタンとなり、複数の項目からひとつを選択するときに使われます。フォームを送信したときにチェックされていたラジオボタンのvalue属性の値がCGIに送られます。今回の場合は、男をチェックしたときには「男」、女をチェックしたときには「女」という値が送られることになります。checked属性は、最初にHTMLを呼び出したときに予めチェックしておく項目に付けます。
「 」とは、スペースを空けるというHTMLの特別な書き方です。見やすくするためのもので、ラジオボタンとは関係ありません。
<input type="text" name="month" size="2">月
monthというテキスト入力フィールドを配置します。以上3つのフォーム部品を配置したことにより、CGIには「namae」「seibetsu」「month」の3つの値が送られることになります。
フォームを処理するプログラム
次に、以下のプログラムをテキストエディタで入力してください。
#!/usr/bin/perl
# 占いプログラム
require "cgi-lib.pl";
print "Content-type: text/html; charset=Shift_JIS\n\n";
&ReadParse(*form);
# ほめ言葉設定
if ($form{"seibetsu"} eq "男") {
$home = "男前";
} else {
$home = "べっぴんさん";
}
# 運勢設定
if ($form{"month"} < 3) {
$unsei = "スーパーラッキー";
} elsif ($form{"month"} < 10) {
$unsei = "ごくふつう";
} else {
$unsei = "大凶";
}
print <<EOL;
<html>
<body>
<p>
ほう、$form{"namae"} はえらく $home じゃのう。<br>
$form{"namae"} の運勢は $unsei じゃ。<br>
</p>
</body>
</html>
EOL
注意事項として、下部のHTML内に書かれている変数の前後には半角スペースを空けてください。入力が終わったら、「uranai.cgi」という名前でサーバにアップロードし、パーミッションを755にしてください。
その後、もういちどuranai.htmlをブラウザで呼び出し、フォーム内容を入力して送信ボタンを押してください。占い結果のメッセージが表示されれば成功です。
プログラムの説明
&ReadParse(*form);
前回と同じく、フォーム送信内容を解釈し、formという連想配列に格納します。この関数によって、$form{"namae"} に名前、$form{"seibetsu"} に性別(「男」または「女」)、$form{"month"} に誕生月が入ります。
if ($form{"seibetsu"} eq "男") {
$home = "男前";
} else {
$home = "べっぴんさん";
}
if文は条件分岐を行なう命令です。変数の内容によって処理の流れを変えたいことは多々ありますが、そういったときに使うのが条件分岐です。if文の基本的な構文は以下のようになります。
if (条件) {処理}
条件が正しいときだけ処理を行ないます。
if (条件) {処理1}
else {処理2}
条件が正しいときに処理1を行ない、条件が違うときに処理2を行ないます。
if (条件1) {処理1}
elsif (条件2) {処理2}
else {処理3}
条件1が正しいときに処理1を行ない、条件1が違ってなおかつ条件2が正しいときに処理2を行ないます。条件1と条件2のどちらも違うときに処理3を行ないます。
if ($form{"seibetsu"} eq "男") {
上記の場合、条件は「$form{"seibetsu"} eq "男"」の部分になります。eqというのはequal、つまり等しいという意味で、$form{"seibetsu"}の値が「男」の場合に条件が正しくなり、中カッコの中の処理を行ないます。
まとめると、$form{"seibetsu"}が「男」の場合に変数$homeが「男前」となり、$form{"seibetsu"}が「男」でない、つまり「女」の場合に変数$homeが「べっぴんさん」となります。
if ($form{"month"} < 3) {
$unsei = "スーパーラッキー";
} elsif ($form{"month"} < 10) {
$unsei = "ごくふつう";
} else {
$unsei = "大凶";
}
この部分も変数の値によって条件分岐をしている部分です。$unseiの値が、
- 誕生月が 1,2 の場合は「スーパーラッキー」
- 誕生月が 3,4,5,6,7,8,9 の場合は「ごくふつう」
- 誕生月が 10,11,12 の場合は「大凶」