パッケージの小技

Perl/Qtを解析していて見つけた小技を紹介する。
※改めてマニュアルを読むと、書いてあることばかりだが。

ロードしたことにする方法

「%main::INC」にファイル名をキーとして任意の値を定義するとロードしたことになり、requireやuseにおいて実際にファイルが存在しなくてもエラーが発生しない。
ただし、useの場合はBEGINブロック内で定義しないと間に合わない。

【エラーになる】

$ perl
use Hoge::Fuge; # 以下のエラーは直ぐに発生する
Can't locate Hoge/Fuge.pm in @INC (@INC contains: ...) at - line 1.
BEGIN failed--compilation aborted at - line 1.


【エラーにならない】

$ perl
BEGIN { $INC{"Hoge/Fuge.pm"} = 1; }
use Hoge::Fuge;
^D ← これはCtrl+Dを押下する意味

useで暗黙に呼ばれるサブルーチン

useは指定したパッケージをロードすると同時に、そのパッケージのimportを呼び出す。

$ perl
package Hoge::Fuge;
sub import { print "- import -\n"; }
package main;
BEGIN { $INC{"Hoge/Fuge.pm"} = 1; }
use Hoge::Fuge; # 以下は直ぐに表示される
- import -
^D ← これはCtrl+Dを押下する意味

パッケージ名が引き数のサブルーチン呼び出し

「<サブルーチン名> <パッケージ名>」と記述すると、指定したパッケージのサブルーチンが呼び出される。

$ perl
package Hoge::Fuge;
sub hello { print "- hello -\n"; }
package main;
BEGIN { $INC{"Hoge/Fuge.pm"} = 1; }
hello Hoge::Fuge;
^D ← これはCtrl+Dを押下する意味
- hello -