* 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 した方がいいのかなぁ。