如何找到已安装的 Perl 模块的版本?
这是在底部的答案,但我认为住在这里足够重要。有了这些建议,我在我的.bashrc
function perlmodver {
perl -M$1 -e 'print "Version " . $ARGV[0]->VERSION . " of " . $ARGV[0] . \
" is installed.\n"' $1
}
大多数模块(尤其是来自 The CPAN 的模块)都有一个 $VERSION 变量:
perl -MSome::Module -le 'print $Some::Module::VERSION'
你为什么要获取模块的版本?您是否需要在程序中使用它,您是否只需要将数字传递给另一个操作,或者您只是想找出您拥有的东西?
我将它内置在cpan
(perl 附带的)-D
开关中,因此您可以在 CPAN 上查看已安装的版本和当前版本:
$ cpan -D 文本::CSV_XS 文本::CSV_XS -------------------------------------------------- ---------------------- Text::CSV 的快速 8 位干净版本 H/HM/HMBRAND/文本-CSV_XS-0.54.tgz /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm 安装:0.32 CPAN:0.54 不是最新的 H.Merijn 品牌 (HMBRAND) hmbrand@xs4all.nl
如果您想查看所有过时的模块,请使用-O
(大写 O)开关:
$ cpan -O 模块名称 本地 CPAN -------------------------------------------------- ---------------------- 阿帕奇::数据库 0.1300 0.1400 阿帕奇::SOAP 0.0000 0.7100 阿帕奇::会话 1.8300 1.8700 Apache::SizeLimit 0.0300 0.9100 Apache::XMLRPC::Lite 0.0000 0.7100 ... 等等
如果您想查看已安装的所有模块的信息,请尝试使用-a
开关创建自动捆绑。
VERSION 是所有 Perl 类的通用方法。您可以使用它来获取模块版本(如果已设置它通常具有的)。
这是一个单行,您只需添加一次模块名称:
perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
有一个少打字的技巧,只要你的模块没有像 Unix 时间戳这样的疯狂的东西作为版本号,它就可以工作。
perl -MFoo::Bar\ 9999
这是有效的,因为它转化为
use Foo::Bar 9999;
即至少版本 9999 或更新的 Foo::Bar 版本。你得到的是
Foo::Bar version 9999 required--this is only version 1.1.
BEGIN failed--compilation aborted.
(我从马特·特劳特那里学到的绝招。)
如果幸运的话,该模块将有一个名为$VERSION的包变量:
$ perl -MCPAN -e 'print "$CPAN::VERSION\n"'
1.9205
这是在 CPAN 上分发模块所必需的,但内部开发的模块可能遵循不同的约定或根本不遵循。
感谢您的回答!我在我的 .bashrc 中创建了一个函数来轻松找到 Perl 模块的版本:
function perlmodver {
perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1
}
对我来说最容易记住和最强大的版本:
perl -e 'use Search::Elasticsearch; print $Search::Elasticsearch::VERSION;'
我写了一个小脚本来报告:perlver。
这是一个简单的小工具,可以告诉您已安装的模块版本以及 .pm 文件的位置。它还确保模块可以成功加载。它会自动将“-”、“/”或“\”转换为“::”,因此您可以使用路径名或分发名称来代替规范的模块名称。
它假定模块定义了一个 $VERSION。如果模块没有定义 $VERSION,它仍然会告诉你.pm
文件在哪里,所以你可以手动检查它。您还可以一次检查多个模块:
$ perlver CPAN DBD-Pg Getopt::Long
CPAN 1.7602 is
/usr/lib/perl5/5.8.8/CPAN.pm
DBD::Pg 1.49 is
/usr/lib/perl5/vendor_perl/5.8.8/i686-linux/DBD/Pg.pm
Getopt::Long 2.36 is
/usr/lib/perl5/vendor_perl/5.8.8/Getopt/Long.pm
此外,对于使用 Exporter.pm 的模块,您可以通过以下技巧获取此信息:
perl -MSome::Module=99999 -ex
Some::Module version 99999 required--this is only version 1.9205 at ...
对于不使用 Exporter.pm 的模块,稍长的技巧会报告相同的信息:
perl -e'use Some::Module 99999'
Some::Module version 99999 required--this is only version 1.9205 at ...
我们在 Solaris 10 中有系统 perl (/usr/bin/perl),上面的解决方案是没用的。其中一些报告“未安装module.pm”,其中一些没有输出。
这是有用的代码,它可以列出所有模块及其版本。
#!/usr/bin/perl
use strict;
use ExtUtils::Installed;
my @modules;
my $installed = ExtUtils::Installed->new();
if (scalar(@ARGV) > 0) {
@modules = @ARGV;
} else {
@modules = $installed->modules();
}
print "Module\tVersion\n";
foreach (@modules) {
print $_ . "\t" . $installed->version($_) . "\n";
}
你也可以看看App::module::version
$ module-version
The version of App::module::version in /home/yourself/perl5/lib/perl5 is 1.004