perlモジュールの検索PATHについて

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

perlではモジュールを読み込むのに use や require を使うが
use と require では評価のタイミングが違う。

実行タイミング
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
Last-modified: 2010-03-21 (日) 11:56:52 (4641d)