perlのモジュールロードパスを調べるには、以下のようにして@INCを参照すればよい。バージョン違いのロードパスが複数ある。これらの異なるロードパスに同じモジュールが重複してインストールされている可能性があるということだ。
$ perl -le "print foreach @INC;" /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 .
IO::Compress::Baseを例にして、このモジュールがどこにあるか検索する。以下のようにして検索できる。3つの場所にインストールされていることがわかる。
$ perl -le "print foreach @INC;" | xargs --replace={} find {} -path "*IO/Compress/Base.pm" | xargs ls -la find: `/usr/local/lib/site_perl': No such file or directory -r--r--r-- 1 root staff 21921 Aug 31 2009 /usr/local/lib/perl/5.10.0/IO/Compress/Base.pm -r--r--r-- 1 root staff 22017 Jan 11 2011 /usr/local/share/perl/5.10.0/IO/Compress/Base.pm -r--r--r-- 1 root staff 22249 Jun 22 16:10 /usr/local/share/perl/5.10.1/IO/Compress/Base.pm
IO::Compress::Baseをモジュールとして読み込んだ場合、どれが使われるかを調べるには以下のようにする。@INCの上から順番にサーチされるので、/usr/local/share/perl/のものが読み込まれることがわかる。
$ perl -MIO::Compress::Base -le "print foreach values %INC;" | grep "Base.pm" /usr/local/share/perl/5.10.1/IO/Compress/Base.pm
ExtUtils::Installedモジュールを使って、このモジュールが提供するファイルを調べる。useでロードされるファイルでは無いものがファイルとして挙げられている。
# perl -MExtUtils::Installed -le 'print foreach ExtUtils::Installed->new->files(shift)' IO::Compress::Base /usr/local/man/man3/IO::Compress::Base.3pm /usr/local/lib/perl/5.10.0/IO/Uncompress/Base.pm /usr/local/lib/perl/5.10.0/IO/Uncompress/AnyUncompress.pm /usr/local/man/man3/File::GlobMapper.3pm /usr/local/man/man3/IO::Uncompress::Base.3pm /usr/local/lib/perl/5.10.0/IO/Compress/Base.pm /usr/local/lib/perl/5.10.0/IO/Compress/Base/Common.pm /usr/local/lib/perl/5.10.0/File/GlobMapper.pm /usr/local/man/man3/IO::Uncompress::AnyUncompress.3pm
ドキュメントによれば、パスの指定もできるらしいので、やってみたが変わらず。
# perl -MExtUtils::Installed -le 'print foreach ExtUtils::Installed->new->files(shift, "all", "/usr/local/")' IO::Compress::Base /usr/local/man/man3/IO::Compress::Base.3pm /usr/local/lib/perl/5.10.0/IO/Uncompress/Base.pm /usr/local/lib/perl/5.10.0/IO/Uncompress/AnyUncompress.pm /usr/local/man/man3/File::GlobMapper.3pm /usr/local/man/man3/IO::Uncompress::Base.3pm /usr/local/lib/perl/5.10.0/IO/Compress/Base.pm /usr/local/lib/perl/5.10.0/IO/Compress/Base/Common.pm /usr/local/lib/perl/5.10.0/File/GlobMapper.pm /usr/local/man/man3/IO::Uncompress::AnyUncompress.3pm
@INCの中身を渡してもダメ。
# perl -MExtUtils::Installed -le '$arg=shift; foreach(@INC){print foreach ExtUtils::Installed->new->files($arg, "all", $_)}' IO::Compress::Base /usr/local/lib/perl/5.10.0/IO/Uncompress/Base.pm /usr/local/lib/perl/5.10.0/IO/Uncompress/AnyUncompress.pm /usr/local/lib/perl/5.10.0/IO/Compress/Base.pm /usr/local/lib/perl/5.10.0/IO/Compress/Base/Common.pm /usr/local/lib/perl/5.10.0/File/GlobMapper.pm