* perlモジュールの検索PATHについて [#w02d09ef]
#setlinebreak(on);

まず perlの実行タイミングは、以下の2つあるらしい。

perlではモジュールを読み込むのに use や require を使うが
use と require では評価のタイミングが違う。
//※実行タイミングについては [[perlの実行タイミングについて]] を参照。

||実行タイミング|h
|use|コンパイル時|
|require|スクリプト実行時|

で、use などを使用してモジュールを読み込む際には、
@INC に設定されたPATH に従ってモジュールが検索される。

つまり MyClass.pm が カレントディレクトリ/pm 配下にある場合、
以下のコードは (1) (2) の順に実行される為、MyClass を検索できない。
(@INCが設定される前に MyClass を探しにいく為)

 unshift @INC, "./pm";  # (2)
 use MyClass;           # (1)

以下ならOK

 use lib qw(./pm);
 use MyClass;

但し、mod_perl の場合はフルpath指定が必要。

 use lib qw(/path/to/pm);
 use MyClass;

または

 BEGIN {
     unshift @INC, "/path/to/MyClass";    # または /path/to/pm
 }
 use MyClass;

以前、[[mod_perl時の注意点]]で書いたメモで

○mod_perlでない時
×mod_perlの時

だったのは use lib qw(./pm) がmod_perlでない時だけ有効なPATHを指してした為だと思われる。

なので「 mod_perlの時はunshift、push で変更を加えた @INC(モジュール検索PATH)が使用されない 」''という事ではない''。

というか mod_perl 時は startup.pl を使って自作モジュールを読み込むのが一般的?らしい。

httpd.confの記述
 PerlRequire /path/to/startup.pl

モジュールがガンガン増えていく場合
それらをstartup.plに取り込めるようなスクリプトもあるみたい。

その辺をいろいろ考えると「あまり使用しないモジュールを必要な時だけ読み込みたい」場合などは
require して import した方がいいのかなぁ。

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS