use libについて
lib.pmのPODを読んだメモ。
lib - search.cpan.org
@INCに追加する
use lib LIST;
は、
BEGIN { unshift(@INC, LIST) }
とほぼ同じである。
サーチパスである@INCの末尾ではなく、先頭に(unshift)追加される。
もしこの際、
- パスを指定しない
- 存在しないパスを指定する
のようなことをしても、特にエラーは投げてくれないので注意。
(そんな使い方もどうかと思うが)
@INCを削除する
no lib LIST;
で、@INCの同一要素を削除することができる。あまり使わない。
ちなみに、プログラムの最初で
no lib @INC; use lib qw{ /path/to/lib1 /path/to/lib2 /lib3 };
のようにすると、コンパイル時のサーチパスを完全にコントロールできる。
元の@INCを取得する
lib.pmでは最初に
our @ORIG_INC = @INC; # take a handy copy of 'original' value
としてオリジナルの@INCを保存しておいてくれている。
no lib LIST;で消しても大丈夫。
# test3.pl use strict; use warnings; no lib @INC; use lib '/tmp'; print "$_\n" for @INC; print "-----------------\n"; print "$_\n" for @lib::ORIG_INC;
$ perl test3.pl /tmp ----------------- /usr/local/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/darwin-2level /usr/local/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3 /usr/local/perlbrew/perls/perl-5.12.3/lib/5.12.3/darwin-2level /usr/local/perlbrew/perls/perl-5.12.3/lib/5.12.3 .
注釈
将来的にFile::Specのようなパスの決め方をする。
もし、@INCに(ディレクトリでなく)ファイルを指定すると、警告を出す予定。
ただし、「.par」ファイルは唯一の例外とする。
(Perl Archive Toolkit)
まとめ
特に意識することなく、プログラムの最初の方で、存在するディレクトリを、サーチパスに加えるのが、一番よい使い方。
手動で@INCを操作すると、もうオリジナル@INCが分からなくなるので、libプラグマ経由で変更した方がよい。