2006年05月23日(火) [過去の今日]
#1 魔法に見えるうちは追い付いてない証拠
よくJcode.pmやEncode.pmを参考にさせてもらってperlでプログラムを書くことがあるのだが、やはり圧倒的にレベルが高い人のソースは魔法のようだ。俺自身のレベルが低いせいもあろうが、あまりに魔法のようで思考がストップしてしまうことがある。
今日も今日とてEncode.pmのfind_encodings()付近で思考が止まった。Encode.pmの頭に%Encodingというハッシュがあるのだが、各エンコードのサブモジュールはここに名前を登録する。Encode::JP::JIS7では、
for my $name ( '7bit-jis', 'iso-2022-jp', 'iso-2022-jp-1' ) { my $h2z = ( $name eq '7bit-jis' ) ? 0 : 1; my $jis0212 = ( $name eq 'iso-2022-jp' ) ? 0 : 1; $Encode::Encoding{$name} = bless { Name => $name, h2z => $h2z, jis0212 => $jis0212, } => __PACKAGE__; }
というようにして登録されている。こうすることで$Encode::Encoding{$name}の中身はEncode::JP::JIS7のオブジェクトになり、当該ネームスペースのメソッドが呼び出せるようだ。
わかってみれば当り前のようにすら思えて来るが、これがなかなか思い付かなかった。実際、他のモジュールでは、substrでスクリプトの文字列を切り出して、evalで実行なんて手段でサブモジュールを動かしてた。それに比べてこの実装の美しいこと、美しいこと。
やはりレベルが高い人のソースを読むのは勉強になる。いろんな意味で、ためいきの出る瞬間でもあるが……。
@ newしてるのと同じ?:
しかし、これって各サブモジュールごとにnewしてんのと同じだよね? サブモジュールが増えると遅くなったりしないかなあ。
(@260)