tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

Variable::Expand::AnyLevel というモジュールを書いてみた

誰得?俺得!な感じなのですが、readpipe(バッククォート演算子)のオーバーロードで書いたように、readpipe をオーバーロードすると、引数の文字列を変数展開してくれない問題があるので、任意の変数をいい感じに展開するヘンな物体を作ってみました。

tsucchi/p5-Variable-Expand-AnyLevel - GitHub

Synopsis も書いてるけど、テストコードが一番使い方の参考になるかなー、と思うので、ここにも載せときます。

use strict;
use warnings;
use Test::More;
use Variable::Expand::AnyLevel qw(expand_variable);

my $value = 'value';
is( expand_variable('$value aaa', 0), 'value aaa');

my @array_values = (
    'AAA',
    'BBB',
);
is( expand_variable('$array_values[0]', 0), 'AAA');
is( expand_variable('$array_values[1]', 0), 'BBB');
# ...

テストコードでは、第二引数が '0' なので、あんまり意味ないですが、この第二引数は caller() とか PadWalker の peek_my() とかの level と同じものなので、たどれる呼び出し元であれば、任意の変数を展開したうえで、値を引っこ抜くことができます。

やってることは、単なる PadWalker のラッパーなのですが、これを使うとカジュアルに変数の値を引っこ抜けるので、デバッグ用にも使えないこともないのかもしれません。(自分で言うのもなんですが、デバッグ用なら PadWalker 直接つかうので十分だとおもう)

展開対象からオブジェクトを除外しているのは、オブジェクトの場合だと、僕の書き方が悪いのか、意図せずデストラクタが走ってしまうことがあって、嫌な感じだったためです。あと、Moose ベースのやつとかもちゃんと動かないんじゃないかな、と思うし。

展開対象を(配列とかスカラーとか)指定するほうがいいのかなー、とかも思うのですが、どうせ使い道がほかに無さそうなので、しばらくは考えないことにします。(ちゃんと考えて API 変える可能性もあります)
(2011/08/06更新) オブジェクトの場合もちゃんと値を返せるようにしました。API もたぶん fix。オプションは増やすかもしれないけど、インターフェースはもう変えない予定。(2011/08/06更新ここまで)

当面 github のみで、しばらくは CPAN には上げない予定。(つーか上げないかもしれない。)なので、CPAN にアップしてほしい人がいたら、僕に連絡ください。(いないと思うけど)