[編集: 私の以前のソリューションにuse Lots::Of::Modules;
は微妙なバグがありました -- 下部を参照してください。この修正により、少し見苦しくなりますが、それでも機能します。]
[編集 #2:BEGIN { ... }
定義された関数がコンパイル時に確実に使用できるように、コードの周りに追加されました。これを指摘してくれた jrockway に感謝します。]
次のコードは、jrockway のコードが行うこととまったく同じことを行いますが、より単純で明確です。
Sets/Of/Modules.inc:
use Carp qw/confess cluck/;
use Path::Class qw/file dir/;
0; # Flag an error if called with "use" or "require" instead of "do"
これら 4 つの関数をインポートするには:
BEGIN { defined( do 'Lots/Of/Modules.inc' ) or die; }
package Lots::Of::Modules;
このファイルの先頭にステートメントがないため、use
ステートメントは呼び出し元のパッケージにエクスポートされます。
またはdo
の代わりに使用する必要があります。後者はファイルを 1 回しかロードしないためです (が複数回呼び出されると失敗します。たとえば、メイン プログラムによって別々のモジュールで呼び出されます)。よりプリミティブなは、引数で指定されたファイルが で見つからない場合でも例外をスローしません。したがって、 で結果をチェックする必要があります。use
require
use Lots::Of::Modules;
use
do
@INC
defined