おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

簡易掲示板(4)

時刻について

perlの時刻を扱うモジュール

perlには時刻を扱うモジュールが複数あるそうです。その中で標準となるものを調べてみたのですが、今ひとつはっきりしませんでした。それで、今回は古い方法を取り入れることにしました。使いやすいとは思わないのですが、きちんと動きます。
time()  1970年1月1日午前0時から現在の時刻までの通算の秒数(UNIX時間)を返す
localtime(UNIX時間) UNIX時間からローカル時間を求める

(秒, 分, 時, 日, 月, 年, 曜日, 日(1月1日からの通算), 夏時間フラグ) = localtime(UNIX時間);

$ENV{'TZ'} = "JST-9"; # ローカル時間を日本時間に設定

localtime の仕様

localtimeの返す値には約束事があります
返り値は、数字の配列になります
月   1月が0、2月が1、・・・12月が11となります
年   1900年からの年数になるので、西暦を求めるには1900を加えます
曜日  日曜日が0, 月曜日が1,・・・土曜日が6, となります
日(1月1日からの通算)   1月1日が0、1月2日が1、・・・
夏時間フラグ  夏時間なら0以外、夏時間でなければ0
これらを踏まえて、UNIX時間から、"yy/mm/dd/(wday) hh:mm:ss"という形に整形するサブルーチンを作りました。
sub fdatetime { # 時間の整形(format date and time)
  my $t = shift; #time
  $ENV{'TZ'} = "JST-9"; #日本時間で
  my %dt;
  ($dt{"sec"}, $dt{"min"}, $dt{"hour"}, $dt{"mday"}, $dt{"mon"},
   $dt{"year"},$dt{"wday"}, $dt{"yday"}, $dt{"isdst"}) = localtime($t);

  $dt{"year"} += 1900;
  $dt{"mon"} = sprintf("%02d",$dt{"mon"} + 1);
  $dt{"mday"} = sprintf("%02d",$dt{"mday"});
  $dt{"hour"} = sprintf("%02d",$dt{"hour"});
  $dt{"min"} = sprintf("%02d",$dt{"min"});
  $dt{"sec"} = sprintf("%02d",$dt{"sec"});
  @weekdays = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
  $dt{"wday"} = $weekdays[$dt{"wday"}];
  return $dt{"year"}."/".$dt{"mon"}."/".$dt{"mday"}."(".$dt{"wday"}.") ".$dt{"hour"}.":".$dt{"min"}.":".$dt{"sec"};
}

その他

htmlでは出力できない文字(&"<>など)は、& amp;などに変換して出力します。

標準出力については、utf8でエンコードするというレイヤーを指定したので、print文の出力が楽になりました。ファイル出力にも同じことができますが、今回は見送ったので、いちいち出力の際にエンコードしました。半角文字のような1バイトの文字はそのまま出力できますので、日本語のときなどだけエンコードすれば大丈夫です。ですので、いちいちエンコードするといっても、回数は少なかったと思います。ファイルの入出力でレイヤーを設定するのはopenの時に行いますが、perlのドキュメントで調べてみてください。

まとめ

今回、簡易な掲示板でしたが、実際動きますし、その内容はより高度なcgiの基礎にはなると思います。より高度なcgiを作っていく上で思いついたことを最後に書きたいと思います。
perl 以外にもphp, Ruby, Python などの言語があるので、どれを使うかを考える
フレームワークといってwebプログラムのノウハウを集めたソフトがあるのでその使用を考える
クッキー、https、などを考える
スパム対策にCAPTCHAを導入する
データの保存にはデータベースを活用する
クライアント側で動くJavascriptを活用する
これらについて書くにはまだまだ力不足ですし、時間も必要なので、また別の機会にとりあげられればと思います。