フリーCGIスクリプト配布サイト。
掲示板の作成で作成したプログラムを改造して、CGIでよく使用される機能をいくつか実装していきたいと思います。まずは投稿日時の記録です。それぞれの記事がいつ投稿されたのかを記録する方法です。
Perlで現在日時を取得するには、time
関数と localtime
関数を使用します。
#!/usr/local/bin/perl
#現在日時の取得
($sec, $min, $hour, $day, $mon, $year, $week) = localtime(time());
@week = ('日', '月', '火', '水', '木', '金', '土');
$year = $year + 1900;
$mon = $mon + 1;
$week = $week[$week];
$date = "$year年$mon月$day日($week) $hour時$min分$sec秒";
print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";
print "<p>現在日時は$dateです。</p>\n";
print "</body>\n";
print "</html>\n";
exit;
time
は現在の日時を取得する関数です。ただし、取得できる値は1970年1月1日0時0分0秒からの経過秒数です。具体的には 1124413705
のような値が帰ってきます。
これでは何時何分なのか判りませんので、判りやすい値に変換します。変換を行うのが localtime
関数です。これは、time
関数で取得した形式の時刻をローカル時間に変換します。帰ってくる値は以下のとおりです。
値 | 数値の範囲 |
---|---|
秒 | 0~59 |
分 | 0~59 |
時 | 0~23 |
日 | 1~31 |
月 | 0~11 |
年 | 西暦 - 1900 |
曜日 | 0~6 |
夏時間調整 | 0か1 |
ご覧のとおり、月と年と曜日はそのまま使用できない値になっていますので、表示する前に少し加工してやる必要があります。サンプルプログラムでは、月に1
を加え、年に1900
を加え、曜日は配列を使用して判りやすい名前に変更しています。
日時の取得処理は決まり文句のようによく使用しますので、決まり文句だと思ってこのまま使用して問題ありません。
掲示板に日時の表示処理を追加したプログラムは、以下のようになります。
#!/usr/local/bin/perl
#投稿された値を受け取る
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'});
} else {
$alldata = $ENV{'QUERY_STRING'};
}
foreach $data (split(/&/, $alldata)) {
($key, $value) = split(/=/, $data);
$value =~ s/\+/ /g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
$value =~ s/\t//g;
$in{"$key"} = $value;
}
#ヘッダの表示
print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>掲示板</title></head>\n";
print "<body>\n";
#受け取ったデータをファイルに書き込む
if ($in{'handle'} ne '' && $in{'message'} ne '') {
if (open(FH, "bbs.txt")) {
@file = <FH>;
close(FH);
#現在日時の取得
($sec, $min, $hour, $day, $mon, $year, $week) = localtime(time());
@week = ('日', '月', '火', '水', '木', '金', '土');
$year = $year + 1900;
$mon = $mon + 1;
$week = $week[$week];
$date = "$year年$mon月$day日($week) $hour時$min分$sec秒";
unshift(@file, "$in{'handle'}\t$in{'message'}\t$date\n");
if (open(FH, ">bbs.txt")) {
print FH @file;
close(FH);
} else {
print "<p>ファイルに書き込めません。</p>";
}
} else {
print "<p>ファイルを読み込めません。</p>";
}
}
#投稿フォームの表示
print "<form method=\"post\" action=\"bbs.cgi\">\n";
print "<p>\n";
print "ハンドルネーム<br>\n";
print "<input type=\"text\" name=\"handle\" size=\"20\" value=\"\"><br>\n";
print "メッセージ<br>\n";
print "<input type=\"text\" name=\"message\" size=\"20\" value=\"\">\n";
print "</p>\n";
print "<p><input type=\"submit\" value=\"送信する\"></p>\n";
print "</form>\n";
#記事の一覧表示
if (open(FH, "bbs.txt")) {
while ($data = <FH>) {
($handle, $message, $date) = split(/\t/, $data);
print "<p>\n";
print "投稿者:$handle<br>\n";
print "メッセージ:$message<br>\n";
print "投稿日時:$date\n";
print "</p>\n";
}
} else {
print "<p>ファイルを読み込めません。</p>";
}
#フッタの表示
print "</body>\n";
print "</html>\n";
exit;
投稿内容をファイルに記録する際、一緒に投稿日時も記録しています。そして記事を一覧表示する際、投稿日時も併せて表示しています。