CPANでinstallしたモジュールを調べる
ExtUtils::Installedを使うと調べられるらしい。
perl -MExtUtils::Installed -le 'print for ExtUtils::Installed->new->modules'
ついでにバージョンも調べることができるらしい。
perl -MExtUtils::Installed -le '$x=ExtUtils::Installed->new; print "$_ ",$x->version($_) for $x->modules'
自分の環境でやってみた。
$ perl -MExtUtils::Installed -le '$x=ExtUtils::Installed->new; print "$_ ",$x->version($_) for $x->modules' Acme::EyeDrops 1.55 Algorithm::C3 0.07 Algorithm::Permute 0.12 Any::Moose 0.07 ...
恥ずかしいので以下略
他の方法でモジュールのバージョンを調べる
ロードしてあるものは"$<モジュール名>::VERSION"で調べられる。
$ perl -MEncode -le 'print $Encode::VERSION' 2.33
モジュール名を引数で渡す場合は中でuseしてevalを使うとよさげ
$ perl -le '$m=pop, eval "use $m; print \$$m"."::VERSION"' Encode 2.33
これを使えば複数のモジュールを一気に調べることもできるね
$ perl -le 'print "$_ ", eval "use $_; \$$_"."::VERSION" for @ARGV' Encode DateTime Acme::EyeDrops Encode 2.33 DateTime 0.47 Acme::EyeDrops 1.55
ちなみに変数名が::と繋がっているとうまくいかないので文字列を分けているけど、違う変数名にしてやれば繋げても大丈夫みたい。
perl -le '/.*/, print "$& ", eval "use $&; \$$&::VERSION" for @ARGV' Encode DateTime Acme::EyeDrops Encode 2.33 DateTime 0.47 Acme::EyeDrops 1.55
モジュールが読み込む他のモジュールを調べる
%INCという変数に読み込んだモジュールが記録されるらしい。
$ perl -MEncode -le 'print "$_ => $INC{$_}" for keys %INC' bytes.pm => /opt/local/lib/perl5/5.8.8/bytes.pm warnings/register.pm => /opt/local/lib/perl5/5.8.8/warnings/register.pm XSLoader.pm => /opt/local/lib/perl5/5.8.8/darwin-2level/XSLoader.pm Carp.pm => /opt/local/lib/perl5/5.8.8/Carp.pm Encode/Alias.pm => /opt/local/lib/perl5/5.8.8/darwin-2level/Encode/Alias.pm vars.pm => /opt/local/lib/perl5/5.8.8/vars.pm Exporter.pm => /opt/local/lib/perl5/5.8.8/Exporter.pm strict.pm => /opt/local/lib/perl5/5.8.8/strict.pm Encode/Config.pm => /opt/local/lib/perl5/5.8.8/darwin-2level/Encode/Config.pm Encode/Encoding.pm => /opt/local/lib/perl5/5.8.8/darwin-2level/Encode/Encoding.pm warnings.pm => /opt/local/lib/perl5/5.8.8/warnings.pm Encode.pm => /opt/local/lib/perl5/5.8.8/darwin-2level/Encode.pm base.pm => /opt/local/lib/perl5/5.8.8/base.pm
モジュール名がkeyになっている。
ということは、これらの依存モジュールすべてのバージョンを調べるには…
$ perl -le 'eval "use ".shift; s|/|::|g, /(.*).../, print "$1 ",eval "\$$1::VERSION" for sort keys %INC' Encode Carp 1.04 Encode 2.33 Encode::Alias 2.12 Encode::Config 2.05 Encode::Encoding 2.05 Exporter 5.63 XSLoader 0.10 base 2.12 bytes 1.02 strict 1.03 vars 1.01 warnings 1.05 warnings::register 1.01
こんなカンジでいいのかな?