綾小路龍之介の素人思考

[perl] 重複したモジュールの存在を確認

同じモジュールが複数の場所にインストールされている。これを調べる方法

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

リファレンス

  1. Man page of FIND
  2. Man page of XARGS
  3. ExtUtils::Packlist - search.cpan.org

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-03-02T04:36:32+09:00
  2. Modified: 2010-03-02T04:36:32+09:00
  3. Generated: 2017-04-11T23:09:18+09:00