【Perl】 インストールされているモジュールの一覧を取得する
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
複数のシステムを運用している場合、それぞれのシステムにどのモジュールが(追加で)インストールされているか、確認したくなることがあります。
インストールされているモジュールの一覧を得るための一般的な方法として、@INC
配下にある.packlist
というファイルの存在を確認する、という方法があります。強引にワンライナーでやろうとすると、概ね以下のようになります。なお、grep /auto/
としているのは、コアモジュールを除外するためです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[atomitech@node01 perlbrew]$ find . -name "*packlist*" | grep /auto/ | \ > perl -ple 's{.+/auto/(.+)/\.packlist}{$1}' | perl -ple 's{/}{::}g' | \ > sort | perl -MUNIVERSAL::require -nle \ > 'if ($_->require) { $version=${$_.'::VERSION'}; \ > print defined $version ? "$_\t$version" : "$_\tundetectable" }' Algorithm::Dependency 1.110 Algorithm::Diff 1.1902 Alien::Tidyp v1.4.7 Any::Moose 0.18 (中略) prefork 1.04 strictures 1.002002 threads::shared 1.4 version 0.95 |
いくつかのモジュールのバージョン取得に失敗していますが、概ねうまくいっているようです。
上記のように.packlist
からモジュール一覧を取得する処理を、もう少し実用的に実装したモジュールとして、ExtUtils::Installedがあります。これを使って、上記よりも少しだけ洗練された(?)スクリプトを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/env perl # pmlist - report modules which are installed on your machine use strict; use warnings; use ExtUtils::Installed; use UNIVERSAL::require; use Getopt::Long; GetOptions( verbose => \my $verbose ); my @installed_modules = ExtUtils::Installed->new->modules; for my $module (@installed_modules) { print $module; if ($verbose) { if ($module eq 'Perl') { print "\t$^V"; } else { # suppress some 'inevitable' warnings local $SIG{__WARN__} = sub { }; $module->require; no strict 'refs'; my $v = ${$module . '::VERSION'}; printf "\t%s", defined $v ? $v : 'undetectable' ; } } print "\n"; } __END__ |
実行結果は、以下のとおりです。
1 2 3 4 5 6 7 8 9 10 |
[atomitech@node01 ~]$ pmlist -v Algorithm::Dependency 1.110 Algorithm::Diff 1.1902 Alien::Tidyp v1.4.7 Any::Moose 0.18 (中略) strictures 1.002002 threads 1.86 threads::shared 1.4 version 0.95 |
概ね、最初のワンライナーと同じ出力ですが、ExtUtils::Installedを使用することによって、ワンライナーで取得できなかったモジュールのバージョンも取得できています。ただしこの方法でも、残念ながらいくつかのモジュールについては正しく取得できていません。尻切れトンボな記事になってしまい恐縮ですが、より正確な方法をご存じでしたら、コメント等でご教示頂けると幸いです。