ワンライナーでモジュールの色んな情報を調べる

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

こんなカンジでいいのかな?