■2005-09-09
* [Perl][メモ] 楽々?アクセサ作成
Perl で楽々アクセサ作成について考えてみたで、可能な限り簡単に$obj->author->name
を実現しようとClass::Accessor::Linkedを書いてみました。author以下のデータにアクセスするために、ハッシュリファレンスをAUTOLOAD可能なオブジェクトにすることで矢印を連結しています。
というわけで効率は悪いし、最初にデータ構造を用意しておかないと深いところのデータが利用できないなど問題が多々があり、実用性はありません。あくまでも$obj->author->name
を実現してみたかったということで。
本当はちゃんとデータ構造を反映したaccessorを生成してあげないといけないのですが、お昼休みではそこまでできませんでした。
* [Perl][メモ] autobox::PropHash
Class::Accessor::Linkedは多少なりともお役に立ったようです(Perlで楽々アクセサ作成〜その2)。 良かったよかった(山科さんのコードはperl5.8.3未満でクラッシュするとありますが、perl本体というよりTest::*系の問題っぽいですね)。
さて、せっかくですので、autoboxを使ってハッシュリファレンスも同様にしてしまいましょう。ということで書いたのがautobox::PropHashです。えらくあっさりしたコードですが。 autoboxとautobox::Coreが必要です(ただしautobox::Coreは便利なメソッドが使えるように継承しているだけ)。
use autobox; use autobox::PropHash; my $obj = {a => {b => 'c'}}; print $obj->a->b; $obj->a->b = 'foo!'; print $obj->a->b; $obj = {}; $obj->a = 1; print $obj->a; $obj->b = [qw/foo bar hoge/]; print $obj->b->join(','); # foo,bar,hoge print $obj->keys->join(','); # a,b
AUTOLOAD
とlvalue
を使うことで $obj->a->b = 'foo!'
なところが粋だと思いませんか? 思いませんか。そうですか。