Filter::Simpleでセイセーイ!

↓の辺とか
http://search.cpan.org/~ingy/Inline-YAML/
↓の辺で
http://search.cpan.org/~kazuho/Filter-SQL/

Filter::Simpleというモジュールが使用されていてなんだかかっちょいいのでやってみました。
http://search.cpan.org/~dconway/Filter-Simple/lib/Filter/Simple.pm


お題
sayサブルーチンをフィルターで作る!!という誰も得しないもの。
(ちなみにperlのバージョンは5.8.8で。)

もっと有用な使い方が有るとは思うんですがね・・・。

とりあえず
↓をホゲホゲいわせたい。

say "hogehoge";
say("hogehoge");
say q/hogehoge/;
say "hoge". "hoge";

フィルタ作成。

package Filter::Say;

use strict;
use warnings;

use Filter::Simple sub {
    code => s/say\s*(.+)\s*(:?;|\n)+/Filter::Say::say($1)/eg;
};

sub say($) {
    my $value = shift;
    my $code = sprintf 'print %s; print "\n";', $value;
    $code =~ s/;+/;/g; # ブロックの最後以外だと二個重なっちゃうので。
    return $code;
}

1;

でuseさせて動かすと・・・

use strict;
use warnings;

use Filter::Say;

say "hogehoge";
say("hogehoge");
say q/hogehoge/;
say "hoge". "hoge";


出たーーーー!

hogehoge
hogehoge
hogehoge
hogehoge

というアンニュイな夕方でしたとさ。

これで何か出来るかな。