時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

perl触ってるんだから一度くらいソースフィルタを触ってみたいなと思ったのでVS.pmを書いた

VS.pmとはワンライナーでおてがるにベンチマークを取るためのPerlモジュールである。
ソースフィルタを実験したくなっただけなので実用性はほぼない。


こんな感じで使える。

perl -MText::Xslate::Util -MVS=1000000 -MURI::Escape -E 'xslate { Text::Xslate::Util::uri_escape($ARGV[0]) } vs orig { URI::Escape::uri_escape($ARGV[0]) }' 'xxxxxxxxxx<"&x7axxxx;xxxxxxxxxxxxxx'


ソースはこんなの。


use Filter::Util::Call; すると
いろいろ必要なサブルーチンをエクスポートしてくれるので、
importの中でこんな感じで回せば使えるっぽい。
おてがる!

    filter_add sub {
        my $status;
        if ($status = filter_read()) {
            die "filter abort. status: $status. " if $status < 0;
 
            s!(^|\s*vs\s|;\s*)(\s*)(\w+)(\s*){!
                my $p = index($1, 'vs') > -1 ? ',' : $1;
                $defined_in_caller->($3) or $is_registered_block->($3) ? "$1@{[$2||'']}$3@{[$4||'']}" : "${p}spec '${3}' => sub {";
            !emsgx;
        };
        return $status;
    };


なお、複雑な構文の場合はDevel::Declareを使うとよいらしい。
CPANモジュールでソースフィルタを使っているモジュールはTryCatch、Smart::Commentsなどがあるらしい。


コード書いたのはずいぶん前だけどそういえばブログ最近書いてないなと思ったので書いた