如何获取已安装的Perl模块的版本和位置?

时间:2009-12-17 07:27:10

标签: perl module

是否有一种智能方法可以检测系统中是否安装了某个Perl模块? 我的旧sutpid方法是编写一个Perl脚本,其中我唯一要做的就是使用该模块。如果我运行检测脚本时没有任何结果,那么我知道模块已经安装,但我仍然不知道哪个版本以及模块的安装位置。

提前感谢。

9 个答案:

答案 0 :(得分:9)

类似的东西:

perl -MModule -e 'print "$Module::VERSION\n"' 2>/dev/null || echo "Not installed"

会给你一个给定模块的版本,或者告诉你它没有安装。用法如下:

perl -MXML::Parser -e 'print "$XML::Parser::VERSION\n"' 2>/dev/null || echo "Not installed"

要查找模块路径,您可以检查@INC以查找可能的位置,或者您可以查看perlwhichpmpath还有pmtools

答案 1 :(得分:5)

我所知道的最短的事情不涉及脚本或shell别名:

$ perl -MFoo::Bar\ 99
Foo::Bar version 99 required--this is only version 1.234.

(或者如果没有安装,则不在@INC内的常用消息)

对于好奇,这与perl -e 'use Foo::Bar 99'相同。

答案 2 :(得分:3)

instmodsh

NAME
       instmodsh - A shell to examine installed modules

SYNOPSIS
           instmodsh

DESCRIPTION
       A little interface to ExtUtils::Installed to examine installed modules, validate your packlists and even create a tarball from an installed module.

SEE ALSO
       ExtUtils::Installed

答案 3 :(得分:3)

这是一个执行该操作的程序:

#!/usr/bin/perl
# testmod - test to see if a module is available

use strict;
use warnings;

my $mod = (shift @ARGV) || die "usage: $0 module\n";

# convert module-name to path
my $file = $mod;
$file =~ s{::}{/}gsmx;
$file .= '.pm';

# Pull in the module, if it exists
eval { require $file }
    or die "can't find module $mod\n";

# Get the version from the module, if defined
my $ver;
{ no strict 'refs';
    $ver = ${$mod . "::VERSION"} || 'UNKNOWN';
}
# And its location
my $from = $INC{$file};
print "module $mod is version $ver loaded from $from\n";

答案 4 :(得分:2)

使用pmvers。顾名思义,它显示了已安装模块的版本。如果未安装模块,则会因熟悉的错误消息而失败:Can't locate … in @INC (@INC contains: …)

使用同一发行版中的pmpath查找模块的安装路径。

答案 5 :(得分:1)

我不知道是否有任何聪明的方法。但是我通常会这样 做的是使用perldoc的'-l'或'-m'选项。例如:

%perldoc -l XML::Simple

,输出如下所示,这是模块文件的完整路径

.../lib/XML/Simple.pm

.../lib/XML/Simple.pm 与您的方法相比,这种方法的优点是,如果安装了模块 输出包含模块位置的路径。但是当模块没有时 安装
或者如果它没有perldoc,则显示的错误消息是“找不到...的文档”
无法区分错误是由于缺少模块还是由于缺失而导致的 文档。在这种情况下,-m选项变得很方便,因为它打印整个
文件的内容以及路径。

答案 6 :(得分:1)

我使用这些bash函数/ Perl oneliners来查找Perl模块的版本号和位置:

# equivalent to perldoc -l <module>
perlwhere() {
    perl -wle'eval "require $ARGV[0]" or die; ($mod = $ARGV[0]) =~ s|::|/|g; print $INC{"${mod}.pm"}' $1
}

perlversion() {
    perl -M$1 -wle'print $ARGV[0]->VERSION' $1
}

: [ether ~].2$; perlwhere Test::More
/usr/lib/perl5/5.8.8/Test/More.pm
: [ether ~].2$; perlversion Test::More
0.94

答案 7 :(得分:1)

pmvers实用程序和其他pmtools将满足您的需求。否则这里有一个单行程序来查找模块版本:

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

答案 8 :(得分:0)

如果您正在寻找跨平台CLI (Linux,OSX,Windows),请考虑我的 whichpm utility ; e.g:

# Locate the Data::Dumper module, and also print
# version information and core-module status.
$ whichpm -v Data::Dumper
Data::Dumper    2.145   core>=5.005 /usr/lib/perl/5.18/Data/Dumper.pm

它还可以找到意外的重复项并列出所有安装的模块。

如果您碰巧安装了Node.js / io.js,可以从npm注册表安装它:

[sudo] npm install whichpm -g

有关手动安装说明等信息,请参阅the repo;这是latest version的直接下载链接(将保持最新状态。)