§6 動的なWebページを出力

3問の中からランダムに選択したパンダクイズを表示させるCGIを作成する。

#!/usr/local/bin/perl
use strict;  #…(1)

# 問題
my @mondai = (
'パンダの毛は白黒だが、皮膚も白黒?',
'パンダは竹以外も食べる?',
'パンダは冬眠する?'
);  #…(2)


# 出題する問題を乱数で決定
my $bangou = int(rand(3));  #…(3)

# Webページを返す
print "Content-Type: text/html\n\n";
print <<"END_HTML";  #…(4)
<html>
<head>
<title>パンダクイズ</title>
</head>
<body bgcolor="#FFFFFF">
<h2>パンダクイズ</h2>
<table border="0" cellpadding="10" cellspacing="0">
<tr>
<td>問題<br>$mondai[$bangou]<br>  #…(5)
<form action="" method="post">
<input type="radio" name="answer" value="yes">YES<br>
<input type="radio" name="answer" value="no">NO<br>
<input type="submit" value="ファィナルアンサー">
</form>
</td>
<td><img src="img/panda5.gif" width="120" height="150"></td>
</tr>
</table>
</body>
</html>
END_HTML


■perlの文法を厳しくチェックする ・・・(1)
use strict;
""(ダブルクォーテーション)や''(シングルクォーテーション)で囲んでいない文字列、 myで宣言されていない変数などがあれば、コンパイルエラーや実行時エラーが発生し、実行されない。 変数のスペルミスの発見に効果がある。

■配列とは ・・・(2)
my @mondai;
配列とは、文字や数値を入れる箱を収める棚のこと。 配列の名前は@の記号で始まる。

■配列に文字や数値をセットする ・・・(2)
my @mondai = (
'パンダの毛は白黒だが、皮膚も白黒?',
'パンダは竹以外も食べる?',
'パンダは冬眠する?'
);
配列にまとめてセットするときは、()中にカンマで区切った文字や数値を並べる。 実行時の効率がちょっとだけ悪いが、次のように1個ずつセットしても良い。
my @mondai;
$mondai[0] = 'パンダの毛は白黒だが、皮膚も白黒?';
$mondai[1] = 'パンダは竹以外も食べる?';
$mondai[2] = 'パンダは冬眠する?';

■出題する問題を乱数で決める ・・・(3)
my $bangou = int(rand(3));
randは0から引き数で指定した数未満の乱数を発生する関数で、intは整数部分を返す関数。 今回は問題の添字である0〜2までの乱数を発生させて、小数を切り捨てた数を得ている。

■ヒアドキュメントでWebページを出力 ・・・(4)
print <<"END_HTML";
<html>



</html>
END_HTML
まとまった文字をperlスクリプトに埋込むことができるヒアドキュメントを使う。 <<の直後にデーターの終わりを示す文字列(終端文字列)を指定すると、 <<の次の行から終端文字列までがひとかたまりの文字列として処理される。 終端文字列をダブルクォートで囲むと、変数展開され、シングルクォートだと変数展開されない。

■配列から取り出す ・・・(5)
$mondai[0];
配列から文字や数値を取り出すときは番号で指定し、最初の棚は0番目になる。 取り出すときの配列名の先頭は@ではなく$となる。 @は棚、$は箱であり、@mondaiはmondaiという名前の棚を表し、$mondai[0]はmondaiという名前の棚の0番目の箱の意味になる。

エラーがでたらどうするの?

まず、Webサーバーのエラーログを見る。 Windowsの場合、Apacheをインストールしたディレクトリの中の logsディレクトリにerror_log(エラーログ)ファイルがある。 これをメモ帳などのテキストエディタで開いてエラーの詳細を確認する。

パンダ君の失敗

ヒアドキュメントの終わりの行で空白の後に終端文字列END_HTMLを書いたら、エラーになったよ。 最後の終端文字列は必ず行の先頭から始めないといけないんだって。 それと終端文字列は、END_HTMLでなくてもHOGE_HOGEやPANDAなど 他の文字列で大丈夫だよ。


戻る メニューへ 次へ