Perl のプラグマモジュールの作り方

autolocale を作る際に Perl のプラグマモジュールの作り方について調べたので、書き残しておきます。

プラグマモジュールとは

strict.pm や warnings.pm のようにレキシカルスコープで振る舞いを変更するモジュールをプラグマモジュールと呼び、通例として小文字のモジュール名がつけられています。

perl 5.10 以降(正確には5.9.5)の perl では組み込みのプラグマモジュールだけでなく自分で作ることができるようになっています。

レキシカルスコープで挙動を変えるには

Perlにはレキシカルスコープで挙動を変えるための仕組みが用意されています。それが、$^Hと%^Hです。

$^H

$^Hはヒントフラグなどと呼ばれる、Perl インタプリタの挙動を変えるためのフラグです。strict.pmとかcommon::senseを読んだことがある人は見たことがあると思います。ヒントフラグの各ビットに意味があります(perl.hに#definedで定義されています)が、よくわからない人はいじらないほうがいいと思います。

%^H

こちらはヒントハッシュなどと呼ばれるもので、レキシカルスコープなハッシュです。この値は (caller($level))[10]で指定したスコープの\%^Hを取り出すことができます。このヒントハッシュの値を利用してレキシカルスコープで挙動を変更することができます。autolocale ではこちらを利用しています。

参考

詳しくは perldoc perlpragma を読めばいいと思います。
perlpragma - perldoc.perl.org