2008-09-25 84 views
48

如何找到已安装的Perl模块的版本?如何找到已安装的Perl模块的版本?

这是在底部的答案,但我认为它足够重要,住在这里。有了这些建议,我创造我.bashrc

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

参见http://stackoverflow.com/questions/ 1920045 /如何获取版本和位置的安装perl模块 – Ether 2009-12-29 01:02:22

回答

52

为什么你想获得该模块的版本?你是否需要在程序中使用它,你只需要将该号码传递给另一个操作,或者你只是想知道你有什么?

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

 
$ cpan -D Text::CSV_XS 

Text::CSV_XS 
------------------------------------------------------------------------- 
     Fast 8bit clean version of Text::CSV 
     H/HM/HMBRAND/Text-CSV_XS-0.54.tgz 
     /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm 
     Installed: 0.32 
     CPAN:  0.54 Not up to date 
     H.Merijn Brand (HMBRAND) 
     [email protected] 

如果你想看到所有出的最新模块,使用-O(大写的O)开关:

 
$ cpan -O 
Module Name        Local 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 
... and so on 

如果你想看到这为所有已安装的模块,尝试-a开关创建autobundle。

50

大多数模块(从CPAN特别是那些)函数有一个$ VERSION变量:

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

这是最好的方式 – dns 2013-05-05 16:01:29

+3

这不是抽象的任何模块工作。不正确的答案。 – 2014-02-17 18:49:29

+3

这工作。但是,在Windows上,它应该引用不同的方式(例如[File :: Fetch](http://perldoc.perl.org/File/Fetch.html)):`perl -MFile :: Fetch -le“打印$ File :: Fetch :: VERSION“` - 双引号而不是单引号(否则,错误消息是结果:”无法找到字符串终结符“'”在EOF之前的任何位置,在-e行1.“) – 2015-04-16 20:16:58

8

如果你是幸运的,该模块都会有一个命名包变量$ VERSION

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

这是需要的模块要在CPAN分发,但内部开发的莫杜尔斯可能会遵循不同的约定,或者根本不会。

+0

这对于在CPAN上分发的模块实际上并不需要。许多发行版都会查看该变量来声明版本,但只有发行版中的主要模块需要这样做。例如,查看Mojolicious中不是Mojolicuous.pm的任何模块。 – 2016-11-03 00:53:32

2

我写了一个小脚本来报告: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 
0

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

有一个不太打字技巧,即工程提供你的模块没有什么疯狂的像Unix时间戳为版本n红棕色。

perl -MFoo::Bar\ 9999 

这工作,因为它转换为是

use Foo::Bar 9999; 

即一个版本美孚::酒吧这至少版本9999或更高版本。 而你得到的是

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

(绝招我从马特鳟教训。)

+0

我也一直在使用这个很久了。不记得我从哪里拿起它,但最有可能我从同一个地方得到它。 – rjray 2008-09-26 02:50:03

28

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

这里是一个班轮在你只有一次添加模块名称:

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

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

它的功能类似于发布的各种单行版本,但它对于错误处理有点聪明,并且可以同时为您提供多个模块的版本。

5

感谢您的答案!我创建了一个功能,在我的.bashrc容易地找到一个Perl模块的版本:Solaris 10中

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

我们有系统的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"; 

} 
0

您还可以看看App::module::version

$ module-version 

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

最容易记住,最可靠的版本对我来说:

perl -e 'use Search::Elasticsearch; print $Search::Elasticsearch::VERSION;'