本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回は同人誌『Acme大全』の発行者として知られるまかまか般若波羅蜜(はんにゃはらみつ)さんで、テーマはAcmeモジュールです。
Perlの徒花(あだばな)Acmeモジュール
Perlでいつもお世話になるCPANモジュールですが、中には役に立たないジョーク系のモジュールもあります。そのようなモジュールには慣習的に「Acme」という名前が付けられていて、現在CPAN上には400個以上のディストリビューションが登録されています。
もともとCPANには特に名前付けのルールもなくジョークモジュールがリリースされていました。しかしそのようなモジュールが多くなるにつれ、何とかしようということでPerlコミュニティの重鎮Damian ConwayによってAcmeという名前空間が提唱されました。この名前の由来は、アメリカのアニメ「バッグス・バニー・ショー」で欠陥商品を送りつけてくる通販会社Acmeからきています。
たとえばよく知られているAcmeモジュールの一つに、Acme::EyeDrops[1]があります。これは、コードを「見栄えの良いもの」に変換するモジュールです。
AcmeモジュールをはじめとしてCPANモジュールのインストールにはcpanmがお勧めです。コマンドラインから、
などでインストールします。
次に、リスト1のような簡単なスクリプトを作成します。(1)でShapeにコマンドラインからの引数を渡しています。Shapeに指定した値がコードを変換する際の形を決定します。(2)でSourceStringに'print "Hello World\n"'
と指定しています。これが変換対象となるコードです。
そして、コマンドラインから引数としてcoffee(数ある変換形のうちの一つ)を渡して実行してみます(図1)。出力結果は、誰がどう見てもcoffee(コーヒーカップ)です。
もちろん実行すれば期待どおりの動作をします。
このように、一見何の役に立つかわからないけれども、やはり実際役に立たないようなモジュールに代表されるのがAcmeモジュールです。筆者は年に一度『Acme大全』という同人誌を発行していて、CPANに登録されている全Acmeモジュールを紹介しています。そのようなこともあって、Acmeモジュールに対しては並々ならぬ思い入れがありますので、今回はみなさんにAcmeモジュールのすばらしさをお伝えできればと思います。
なお本稿の実行環境は、特に断りがない限りPerl 5.14.2を使用しています。
さまざまなジョークモジュール
ここでは、初めて実行したときに「これはしてやられた(笑)」と筆者が感じたAcmeモジュールを紹介します。
Acme::Tests──テストする側からテストされる側に
通常、CPANモジュールをインストールするときには同梱のテストを実行すると思います。しかし、このモジュールでは逆にテストが出題されます。
図2のように次々と問題が出題され、全問正解しないとテストにパスできません。
テストを自作してみる
すばらしいことに、Acme::Testsを使えば自作のテスト出題モジュールも簡単に作れます。
Acme::Testsをuseして、__DATA__
行以降に問題文、選択肢、答え、区切り文字(----
)を加えていくだけです(リスト2)。
今回、起動スクリプトはAcme::Testsのテストファイルディレクトリに付属のものを使いまわしました(リスト3)。ユーザの解答を標準入力から取得し、答えの番号と突き合わせています。proveコマンドで確認してみましょう。
ちゃんとテストが出題されました。とても楽しいですね!
Acme::Addslashes── PHPのあの関数を導入してみる
ところで、PHPにはaddslashesという組込み関数があります。addslashesは'(シングルクォート)、"(ダブルクォート)、\(バックスラッシュ)、NULLの前にエスケープのためにスラッシュを付ける関数です。Perlにはこのような関数はありませんが、Acme::Addslashesを導入すれば「似たようなもの」が手に入ります。
リスト4を実行すると、図3のような結果になりました。なんだかやたらめったらスラッシュが加えられていて、とてもセキュウアァァ……な気がしますね[2]。