Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Acme::Code::Police - Goodbye World!

コーディングスタイルをムリヤリ 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 は、機械に向き合いっぱなしで殺伐としがちなプログラミングに「もの悲しく、切ない」という人間的な気分を導入するという意味で、大変に秀逸なモジュールであるといえましょう。