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

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

中创建了一个函数
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

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)
        h.m.brand@xs4all.nl

如果您想查看所有过时的模块,请使用 -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 开关创建自动提示。

其他提示

大多数模块(尤其是来自CPAN的模块)都有一个$ VERSION变量:

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

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

这是一个只需要添加模块名称一次的单行程序:

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

有一个打字较少的技巧,如果您的模块没有像Unix时间戳那样疯狂的版本号,那就可以了。

perl -MFoo::Bar\ 9999

这是有效的,因为它转换为

use Foo::Bar 9999;

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

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

(我从Matt Trout那里学到了很多技巧。)

如果运气好,该模块将有一个名为 $ 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
} 

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

它的功能类似于发布的各种单行人员,但它在错误处理方面更为智能,并且可以同时为您提供多个模块的版本。

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

最简单的记忆和最强大的版本:

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

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

我们在Solaris 10中有系统perl(/ usr / bin / perl),上面的解决方案都没用。其中一些报告“未安装module.pm”,其中一些没有输出。

以下是有用的代码,可以列出所有模块及其版本。

<*> . "\t" . $installed->version(

我们在Solaris 10中有系统perl(/ usr / bin / perl),上面的解决方案都没用。其中一些报告“未安装module.pm”,其中一些没有输出。

以下是有用的代码,可以列出所有模块及其版本。

<*>) . "\n"; }

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

$ module-version

The version of App::module::version in /home/yourself/perl5/lib/perl5 is 1.004
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top