Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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
.

注意

UNIXファイルパスの形式でしか、指定はできないけれど、これはUNIX上でしか動かないということではなくて、最初に変換してくれる。
(ただしWindowsは除く、のかな?)

注釈

将来的にFile::Specのようなパスの決め方をする。


もし、@INCに(ディレクトリでなく)ファイルを指定すると、警告を出す予定。
ただし、「.par」ファイルは唯一の例外とする。
Perl Archive Toolkit)

まとめ

特に意識することなく、プログラムの最初の方で、存在するディレクトリを、サーチパスに加えるのが、一番よい使い方。
手動で@INCを操作すると、もうオリジナル@INCが分からなくなるので、libプラグマ経由で変更した方がよい。