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

时间:2020-03-06 14:44:47  来源:igfitidea点击:

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

这是在底部找到答案,但我认为在这里生活很重要。带着这些建议,我在我的.bashrc中创建了一个函数。

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

解决方案

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

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

如果幸运的话,该模块将具有一个名为$ VERSION的包变量:

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

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

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

This is a simple little tool that
  tells you what version of a module you
  have installed, and where the .pm file
  is located. It also ensures the module
  can be loaded successfully. It
  automatically converts ‘-’, ‘/’, or
  ‘\’ to ‘::’, so you can use a pathname
  or distribution name instead of the
  canonical module name.

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

如果模块没有像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.

(我从马特·特劳特中学到的绝妙技巧。)

为什么要尝试获取模块的版本?我们是否需要从程序中获取此信息,还是只需要将数字传递给其他操作,还是只是想弄清楚所拥有的内容?

我使用-D开关将其内置到cpan(perl随附)中,因此我们可以在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开关来创建自动捆绑包。

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

这是一个衬板,我们只需要添加一次模块名称:

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

在CPAN上查看pmtools脚本。如果我们使用的是基于Debian的发行版,那么还有一个方便的pmtools软件包。其中包括一个脚本" pmvers",用于告诉我们模块的版本。非常方便。

它的功能类似于发布的各种单行代码,但是在错误处理方面更聪明,并且可以一次为我们提供多个模块的版本。

感谢回答!我在.bashrc中创建了一个函数,可以轻松找到Perl模块的版本:

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