我如何find已安装的Perl模块的版本?

你如何find已安装的Perl模块的版本?

这是在底部的答案,但我认为足够重要的是活在这里。 有了这些build议,我在我的.bashrc创build了一个函数

 function perlmodver { perl -M$1 -e 'print "Version " . $ARGV[0]->VERSION . " of " . $ARGV[0] . \ " is installed.\n"' $1 } 

你为什么试图获得模块的版本? 你是否需要在程序中使用这个数字,你只需要把这个数字传递给另一个操作,或者你只是想知道你有什么?

我把这个内置到cpan (它带有perl)和-D开关,所以你可以看到你已经安装的版本和CPAN上的当前版本:

 $ cpan -D Text :: CSV_XS

文字:: CSV_XS
 -------------------------------------------------- -----------------------
        快速8位干净版本的文本:: CSV
         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
 -------------------------------------------------- -----------------------
 Apache :: DB 0.1300 0.1400
 Apache :: SOAP 0.0000 0.7100
 Apache :: Session 1.8300 1.8700
 Apache :: SizeLimit 0.0300 0.9100
 Apache :: XMLRPC :: Lite 0.0000 0.7100
 ... 等等

如果您想要查看已安装的所有模块,请尝试使用-a开关创build自动装箱。

大多数模块(特别是来自CPAN的模块)都有一个$ VERSIONvariables:

 perl -MSome::Module -le 'print $Some::Module::VERSION' 

VERSION是所有Perl类的通用方法。 您可以使用它来获取模块版本(如果它已经被设置,通常有)。

这里是一个你只需要添加一个模块名称的class轮:

 perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module 

有一个较less的input技巧,这个工作提供你的模块没有像Unix时间戳那样疯狂的版本号。

 perl -MFoo::Bar\ 9999 

这工作,因为它是什么翻译

 use Foo::Bar 9999; 

即Foo :: Bar的版本至less为9999或更新版本。 而你得到的是

 Foo::Bar version 9999 required--this is only version 1.1. BEGIN failed--compilation aborted. 

(我从马特·特劳特那里学到的巧妙技巧。)

如果幸运的话,模块将会有一个名为$ VERSION的包variables:

 $ perl -MCPAN -e 'print "$CPAN::VERSION\n"' 1.9205 

这是在CPAN上分发模块所需要的,但是内部开发的模块可能遵循不同的约定,或者根本不采用。

感谢您的答案! 我在.bashrc中创build了一个函数来轻松地findPerl模块的版本:

 function perlmodver { perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1 } 

查看CPAN上的pmtools脚本。 如果您使用的是Debian(基于)的发行版,那么也有一个方便的pmtools软件包 。 这包括一个脚本“pmvers”,告诉你一个模块的版本。 这非常方便。

它的作用类似于发布的各种单行版本,但是对于error handling来说更聪明一点,并且可以一次给你多个模块的版本。

我写了一个小脚本来报告: perlver 。

这是一个简单的小工具,告诉你已安装的模块的版本以及.pm文件的位置。 这也确保模块可以被成功加载。 它会自动将“ – ”,“/”或“\”转换为“::”,以便您可以使用path名或分布名称而不是规范模块名称。

它假定模块定义了$ 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 

我们在Solaris 10中有perl(/ usr / bin / perl)系统,上面的解决scheme是没用的。 其中一些报告“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"; } 

另外,对于使用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 ... 

你也可以看看App :: module :: version

 $ module-version The version of App::module::version in /home/yourself/perl5/lib/perl5 is 1.004