トップ(最新)

nDiki : Perl v5.8

スポンサード リンク

Related term

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 な利用者にとってはインストールするのも面倒か。 最低限のエラーチェックを自前で用意して、互換になるようにした方がいいかな。

スポンサード リンク


[ 12月23日全て ]

2004年2月3日 (火)

[WiKicker] WiKicker の文字化け対応 このエントリーを含むはてなブックマーク

WiKicker文字化けであるが Perl v5.6.x という環境が怪しそう。 ということで、ローカルに Perl v5.6.2 を入れてテスト。

 tar zxvf perl-5.6.2.tar.gz
 cd perl-5.6.2
 rm -f config.sh Policy.sh
 sh Configure -de -Dprefix=/usr/local/perl-5.6.2
 make
 make test
 make install

で /usr/local/perl-5.6.2/bin/perl -MCPAN -e shell でもりもり必要なモジュールをインストール

WiKicker のテスト。化けた。 追いかけてみると、Locale::Maketext モジュールが use utf-8 をしているため、l10n した文字列は UTF-8 として mark されてしまっているようだ*1。 で、mark されていない他の部分の(バイト列としてのUTF-8)文字列と結合したりしたところで化けたと。

ということで、Perl v5.6.x では maketext で帰ってきた文字列の UTF-8 mark を外すようにする。

 if (5.006 <= $] && $] < 5.7) {
     return eval "no utf8; my \$tmp = \$language_handle->maketext(\@param); \$tmp =~ /^(.*)\$/; \$1";
 }

という緊急処置コード。 Perl 5.0005_03 では utf8 プラグマ自体が無いので、eval の中に入れておく。 v5.6.x での UTF-8 mark の外し方が良くわからないので、とりあえず正規表現に全マッチさせるというダサいコード(v5.8 だと utf8::* にそこら辺の関数があるのだが)。

*1Perl 5.6.x では Perl v5.8.x のように "UTF8" flag という呼び名はないのかな?


[ 2月3日全て ]

2004年5月19日 (水)

YAML Perl モジュール このエントリーを含むはてなブックマーク

データファイルをYAMLで扱おうと思い、YAML Perl モジュール (0.35)でちょこちょこと実験。

@ 日本語がことごとく quote される。

ある UTF-8 で書かれたファイルを読み込んで YAMLで Dump したら、日本語の部分がことごとく quote される。 これはいただけない。

 my $ESCAPE_CHAR = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f]';

で判別している。手抜きではないか。 さてどうしたものか。

と考えていたら、よく考えたら Perl v5.8.x だとバイト単位ではなく文字単位で正規表現マッチングさせられるんだったことを思い出した。 手抜きだなんて思って失礼しました。

データファイルを読んで utf8::decode してから YAML で Dump するようにしたらクオートされなくなった。Good.

Perl v5.6 系だとどうすればいいんだろ。 YAML.pm を直接書き換えて

 use utf8;

を追加すれば期待通りにはなるのだが、ちょっと嫌だな。

@ sequence をインラインで

短い sequence は

 - a
 - b
 - c

ではなく

 [a, b, c]

の形式で出して欲しい。YAML.pm のチェックしたところ

 my $y = YAML->new;
 $y->InlineSeries(5);
 print $y->dump($data);

のようにインラインにしてよい上限の個数を指定すればよいことを知る。


[ UTF8 フラグ ]


[ 5月19日全て ]

2007年3月8日 (木)

Perl の constant プラグマで1度に複数の定数を定義できるのは Perl v5.8.0 から このエントリーを含むはてなブックマーク

'use constant' を使った Perl プログラムを Perl 5.005_03 下で動かしたらエラー。 調べてみると、

 use constant {
     SEC   => 0,
     MIN   => 1,
     HOUR  => 2,
     MDAY  => 3,
     MON   => 4,
     YEAR  => 5,
     WDAY  => 6,
     YDAY  => 7,
     ISDST => 8,
  };

  (constant 1.04 Pod より)

という形で複数の定数をまとめて定義できるのは constant 1.04 からだ。

Perl 5.005_03 は 1.00、Perl v5.6 系は 1.02 で、1.04 になったのは Perl v5.8.0*1 なので、この形を使えるのは Perl v5.8 以降ということになる。

*1奇数系を入れると Perl v5.7.3 から


[ 3月8日全て ]

スポンサード リンク

■よく検索されるキーワード

提案書(75) torrent(69) perl(61) 書き方(45) 充電式カイロ(43) windows(38) x31(36) 使い方(32) linux(32) cvs(25) アジェンダとは(25) usb(25) thinkpad(23) 静電気(21) サンプル(20) 口コミ(20) ヨドバシ(20) アジェンダ(20) 画像(19) debian(19) ubuntu(19) mp980(18) f-01a(18) 手帳(17) tc-1(17) 秋葉原(16) ssh(16) subversion(16) グッズ(16) a6(15) 壁紙(15) ほぼ日手帳(15) c#(14) ダイソー(14) svn(14) 交換(14) インストール(13) 加湿器(13) firefox(12) ノート(12) 無印(12) 日本語(12) wiki(12) ganttproject(12) デロンギ(11) 方眼(11) ヨドバシカメラ(11) デザイン(11) nikkor(11) 設定(11) 作り方(11) dropbox(11) af(10) terastation(10) memcached(10) レビュー(10) カバー(10) カイロ(10) 2009(10) 除去(10) nikon(10) tortoisesvn(10) クラリチン(9) ガントチャート(9) 動画(9) ポメラ(9) ご査収(9) rcs(9) モジュール(9) n-01a(9) フィルム(9) 写真(9) システム手帳(9) edition(9) porter(9) xp(8) imap(8) 4c(8) docomo(8) ミニ6穴(8)

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

Process Time: 12.340605s / load averages: 0.49, 0.70, 0.82
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)