如何从命令行检查系统上是否安装了 Perl 模块?

我试图检查系统中是否安装了 XML: : Simple。

perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'

上面的一行程序用于列出安装在我的系统中的所有模块,但是它没有列出 XML 模块。

但是,下面的代码执行得很好。

perl -e "use XML::Simple "

有什么问题吗?

194331 次浏览

您可以通过以下方式检查模块的安装路径:

perldoc -l XML::Simple

一行程序的问题在于,它不会递归地遍历目录/子目录。因此,您只能获得实用的模块名称作为输出。

您所做的不是递归到目录中。它只是在 @INC目录的根目录中列出模块。

模块 XML::Simple将驻留在 XML/Simple.pm下的一个 @INC路径中。

他上面所说的是为了找到具体的模块。

CPAN解释了如何在这里找到所有模块,请参见 如何找到已安装的模块

$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'

From the perlvar entry on %INC:

  • %INC

The hash %INC contains entries for each filename included via the do, require, or use operators. The key is the filename you specified (with module names converted to pathnames), and the value is the location of the file found. The require operator uses this hash to determine whether a particular file has already been included.

If the file was loaded via a hook (e.g. a subroutine reference, see require for a description of these hooks), this hook is by default inserted into %INC in place of a filename. Note, however, that the hook may have set the %INC entry by itself to provide some more specific info.

而(<@INC >)

这将@INC 中的路径连接到一个字符串中,用空格分隔,然后对字符串调用 globb () ,然后在空格分隔的组件中迭代(除非有文件 globbing 元字符)

如果@INC 中有包含空格的路径,[]、{}、 * 、 ? 或 ~ , 而且似乎没有理由避免安全的替代方案:

for (@INC)

如果您想快速检查模块是否已安装(至少在 Unix 系统上,使用 巴斯作为 shell) ,请将此添加到您的。Bashrc 文件:

alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\$@?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1"

然后你可以:

=> modver XML::Simple
No module found


=> modver DBI
Version 1.607

速战速决:

$ perl -MXML::Simple -e 1

如果在 Windows 下运行 ActivePerl:

  • C:\>ppm query *获取所有已安装模块的列表

  • 检查是否安装了 XML::Simple

例如,要检查是否安装了 DBI 模块,请使用

perl -e 'use DBI;'

如果没有安装,您将看到错误。 (来自 http://www.linuxask.com)

我相信您的解决方案将只查看@INC 数组中包含的每个目录路径的根目录。你需要一些递归的东西,比如:

 perl -e 'foreach (@INC) {
print `find $_ -type f -name "*.pm"`;
}'

为@user80168的解决方案喝彩(我还在计算 \!) ,但是为了避免所有涉及别名和 shell 的转义:

%~/ cat ~/bin/perlmod
perl -le'eval qq{require $ARGV[0]; }
? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" )
: print "Not installed" ' $1

效果相当不错。

这里可能是最简单和最“现代”的方法,使用 Module::Runtime:

perl -MModule::Runtime=use_module -E '
say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI

如果没有安装模块,这将产生一个有用的错误。

使用 -MModule::Runtime需要安装它(它不是核心模块)。