パッケージの小技
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 -