例題:Web掲示板

以下のプログラムはごく簡単なWeb掲示板のCGIプログラムである。

board.cgi - ごく簡単な掲示板のプログラム
#!/usr/bin/env perl

# http ヘッダの出力
print "Content-Type: text/html\n\n";
# ボードファイル名
$bfile ="board.dat";

&decode;

$mes = $tags{'message'};
$name = $tags{'name'};
if ($mes) { $mes = &unspecial($mes); }
if ($name) { $name = &unspecial($name); } else { $name = "名無し"; }

# メッセージがあったら、名前と共にボードファイルに追加
if ($mes) {
    open(FH, ">>" . $bfile);
    print FH <<"END";
<dt>${name} さんの書き込み:</dt>
<dd>${mes}</dd>
END
    close(FH);
}

# HTMLファイルの先頭部分を出力
print "<html><body>\n";
print "<h1>Very simple Web board</h1><hr><dl>\n";

# 間にボードファイルの内容を挟み込む
open(FH, $bfile);
while (<FH>) {
    print $_;
}
close(FH);

# HTMLファイルの末尾部分(フォーム含む)を出力
print <<"END";
</dl>
<hr>
<form method=post action=board.cgi>
お名前:
  <input type=text size=20 name="name" value="$name"><br>
書き込み欄: <br>
<textarea name=message rows=5 cols=60>
</textarea><br>
<input type=submit value="書き込み">
<input type=reset value="クリア">
</form>
</body>
</html>
END

#------------------------------------------------------------
# cgi.pl - decode CGI input.
# by ETO Kouichirou <t91069ke@sfc.keio.ac.jp>
# date 1994/05/11
#
# Usage:
#
#	&decode;
#	...
#	$name = $tags{'name'};

sub decode {
    local($args, $n_read, *terms, $tag, $value);

    if ($ENV{'REQUEST_METHOD'} eq "POST"){
        $n_read = sysread(STDIN, $args, $ENV{'CONTENT_LENGTH'});
    } else {
        $args = $ENV{'QUERY_STRING'};
    }

    @terms = split('&', $args);

    foreach (@terms) {
        ($tag, $value) = split(/=/, $_, 2);
        $otags{$tag} = $value;		 # original tags
        $tags{$tag} = &unpack($value);	 # tags is global
    }
}

sub unpack {
    local($value) = @_;
    $value =~ s/\+/ /g;
    $value =~ s/%(..)/pack("c", hex($1))/ge;
    return $value;
}

sub unspecial {
    local($value) = @_;
    $value =~ s/&/&amp;/g;
    $value =~ s/</&lt;/g;
    $value =~ s/>/&gt;/g;
    return $value;
}

備考:

課題

  1. 上記board.cgiを使ってWeb掲示板のCGIを実行せよ。
  2. 上記board.cgiを元に、さらに書き込んだ時の時間が書かれるようにプログラムを修正せよ。 例えば、「〜 さんは書きました:」の行が「〜 さんは書きました(2007/6/24 09:24:30)」といった風になるようにせよ。
  3. 上記board.cgiで名前を記入しなかった場合は、掲示板に追加しないようにせよ。その場合、「お名前を記入して書き込んでください。」というメッセージを表示せよ。

東京情報大学情報システム学科
大見 嘉弘(Yoshihiro OHMI)