トップ(最新)

nDiki

2003年12月23日 (火)

Time::Local::gmtime の範囲チェック このエントリーを含むはてなブックマーク

スポンサード リンク

Perl v5.8.x だと、Time::Local::gmtime できちんと範囲チェックが動作している(範囲外だと croak される)のだが、Perl 5.005_03 では必ずしもそうではないようだ。 WiKickerデバッグ中に発見。

でソースを読んでみると、古い Time::Local では cheat サブルーチンで

  • 範囲チェック
  • 指定した年月の開始 gmtime を計算し、%cheat にキャッシュ

している。同一年月での2度目以降 timegm 呼び出しでは %cheat キャッシュを使用して cheat サブルーチンを呼びにいかないので、範囲チェックが実行されないという塩梅。 つまり 2003年1月1日… で一度 timegm を呼び出すと2003年1月に関しては以降 cheat サブルーチンは呼ばれないため、次に 2003年1月33日…で読んでもエラーにしてくれないというわけ(最初に2003年1月33日…で呼んだ場合はちゃんとエラーになるので逆に厄介)。

Perl v5.8.0 以降に標準ではいっている Time::Local ではきちんと毎回チェックする。 うるう年・大の月/小の月も考慮してチェックされる(v5.8.0 より前のでは 31 より大きいかのチェックのみ)。

であり、CPAN では 5.005_03 でも動作する Time::Local パッケージ (1.05~)が公開されている。

Time::Local 1.04 以降を PREREQ_PM にしてもいいのだが、5.005_03 な利用者にとってはインストールするのも面倒か。 最低限のエラーチェックを自前で用意して、互換になるようにした方がいいかな。

twitter.com/Naney の follower になってください。


[ 12月23日全て ]

Related term


この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.140695s / load averages: 0.22, 0.18, 0.17
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)