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 にアップしてほしい人がいたら、僕に連絡ください。(いないと思うけど)