Acme::W

dameninngenn
2010-12-13

こんにちは、冬なのに脇からの発汗が凄まじいdameninngennです。
脇周りが白くなってるインナーを確認してはニッコリする毎日です。

さて、先日Acme::Wなるモジュールを書いてみましたので今回はその紹介をさせて頂きます。

このAcme::Wというモジュールもacme Track 8日目を担当されたhide_o_55さんAcme::Tsuと同様にソース書き換え系のモジュールです。

使い方は簡単。cpanからAcme::Wをインストールし、先頭に「use Acme::W;」と書くだけです。

use Acme::W;

use strict;
use warnings;

print "Hello Acme World!!\n";

上記のスクリプトを実行すると

% perl w.pl
Hello Acme World!!

と表示され、ファイルが下記のように書き換わります。

use Acme::W;

WwwWw strict;
WwwWw warnings;

WWwwWW "Hello Acme World!!\n";

=pod
# This file rewrote by Acme::W version 0.03.
# The following codes are original codes.

use Acme::W;

use strict;
use warnings;

print "Hello Acme World!!\n";

=cut

useやprintがwとWの文字列に変わっていますね。
この書き換わったスクリプトを実行しても同様に「Hello Acme World!!」と表示されます。

このモジュールは何をしているのかざっくり説明すると、Filter::Simpleというモジュールを利用し、予約語(判別は正規表現でやっているので厳密には"予約語のようなもの"です)をwとWで構成された文字列に置換しています。
また、wとWで構成された文字列を検出した場合は対応する予約語に変換し実行しています。

Acme::Wを作るにあたりAcme::Bleachというモジュールを参考にさせていただいたのですが、実行すると元のソースが跡形も無く消えてしまうことにびびってしまい、Acme::Wでは変換後のソースに元のソースを残しています。

これで気になるあの子が離席している隙に一行「use Acme::W;」と書いておけば「やだ、これ、ステキ!」となること間違い無しですね!
(※1 現実は非情です。決して真似しないでください。)
(※2 svnやgitなどのバージョン管理システムを使っていても、真似しないほうが平和かもしれません。)

Acme::Wではコメント文やクォートで囲まれた箇所は置換の対象としていません。

気になるあの子にどうしてもサプライズメッセージを伝えたい場合はクォート部を読みにくくするために記号プログラミングを組み合わせてみればいいのではないでしょうか。

sym Track 5日目を担当されたsugyanさんのやり方で書いてみましょう。

use Acme::W;

WwwWw strict;
WwwWw warnings;

WWwwWW +('`'^')').' '.('`'|',').('`'|'/').('['^'-').('`'|'%').' '.('['^'"').('`'|'/').('['^'.')." :)\n";

これなら実行してみるまでどうなるかわかりませんね。

Filter::Simpleを利用したAcmeモジュールは色々あっておもしろいので是非試してみて下さい!