コーディングスタイルをムリヤリ use strict 対応にしてしまう Acme::Code::Police モジュールについて説明します。
概要
Name | Acme::Code::Police |
---|---|
URI | http://search.cpan.org/~ovid/Acme-Code-Police/ |
Acme::Code::Police は、ジョークモジュールが数多く登録されている Acme シリーズのひとつであり、作者は Curtis 'Ovid' Poe 氏です。
このモジュールは、名前から推察される通り、「悪い」プログラムを police のように取り締まります。その動作は非常に過激で、呼び出し元スクリプトが strict プラグマを使用していない場合、なんの確認もなく削除してしまいます。このため、このモジュールの使用には、細心の注意を払う必要があります。とはいっても、単に "use strict;" すればいいだけなのですが ;-)
strict プラグマとほぼ同じ?
2003 年夏に行われた、いわゆる lightweight language についてのカンファレンスである LL Saturday の模様をまとめたムックに寄稿された、早川真也氏による文章により、このモジュールの存在を知りました。
strict プラグマは絶対に忘れてはいけない。代わりに "use Acme::Code::Police;" でもほぼ同じ意味になる。フリーの CGI スクリプトなどを利用する際は、ソースに付け加えてみるとよいだろう(念のためソースファイルのバックアップを取っておくことをお忘れなく)。
『Lightweight Language Magazine』(ASCII・刊、ISBN:4756444411)p.69-70
そして、忠告を無視して「念のため」の処置を取らずに strict プラグマを使用していないスクリプトに "use Acme::Code::Police;" してしまうと、途方に暮れることになるというわけです。
ソース探訪
Acme::Code::Police のソースの肝は以下の一行にあり、非常に簡潔です。呼び出し元スクリプトが strict.pm をインクルードしているかどうかを調べ、インクルードしていなければ当該スクリプトを削除してしまいます。
INIT{unless(exists$INC{'strict.pm'}){unlink((caller)[1])}}
使用例 - Goodbye World!
使い方は、スクリプトに "use Acme::Code::Police;" を追加するだけで、非常に簡単です。しかし、その結果の「被害」は、上述の通り、場合によっては非常に甚大なものになり得ます;-)
GoodbyeWorld.pl
#!/usr/bin/env perl
use Acme::Code::Police;
print "Goodbye World!\n";
上記のGoodbyeWorld.plは、実行すると "Goodbye World!" という辞世の言葉を残して、この世から永遠に旅立ってしまいます。
まとめ
以上に見た通り Acme::Code::Police は、機械に向き合いっぱなしで殺伐としがちなプログラミングに「もの悲しく、切ない」という人間的な気分を導入するという意味で、大変に秀逸なモジュールであるといえましょう。