71

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

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

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

但是,以下执行正常。

perl -e "use XML::Simple "

可能是什么问题?

4

10 回答 10

108

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

perldoc -l XML::Simple

您的单线问题在于,它不是递归遍历目录/子目录。因此,您只会得到实用的模块名称作为输出。

于 2009-06-24T15:32:26.253 回答
49

又快又脏:

$ perl -MXML::Simple -e 1
于 2009-06-24T15:55:55.957 回答
22
$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'

perlvar条目上%INC

  • %INC

哈希%INC包含通过 、 或 运算符包含的每个文件名dorequire条目use。键是您指定的文件名(模块名称转换为路径名),值是找到的文件的位置。操作员使用require此哈希来确定是否已包含特定文件。

如果文件是通过挂钩加载的(例如,子例程引用,请参阅这些挂钩的说明),默认情况下会插入此挂钩%INC以代替文件名。但是请注意,该挂钩可能已自行设置 %INC 条目以提供一些更具体的信息。

于 2009-06-24T15:43:22.520 回答
17

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

perl -e 'use DBI;'

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

于 2013-03-01T16:15:10.367 回答
11

如果您想快速检查是否安装了模块(至少在 Unix 系统上,使用Bash作为 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
于 2009-06-24T15:55:39.963 回答
9

你在那里做的不是递归到目录中。它仅列出目录根目录中的模块@INC

该模块XML::Simple@INC位于XML/Simple.pm.

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

CPAN说明如何在此处查找所有模块,请参阅如何查找已安装的模块

于 2009-06-24T15:36:24.077 回答
3

而 (<@INC>)

这将@INC 中的路径连接在一个字符串中,用空格分隔,然后在字符串上调用 glob(),然后遍历空格分隔的组件(除非有文件通配元字符。)

如果@INC 中有包含空格、\、[]、{}、*、? 或 ~ 的路径,则此方法效果不佳,并且似乎没有理由避免使用安全的替代方法:

for (@INC)
于 2009-06-24T15:54:20.340 回答
3

如果您在 Windows 下运行ActivePerl :

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

  • C:\>ppm query XML-Simple检查是否XML::Simple已安装

于 2010-03-11T11:00:27.107 回答
0

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

 perl -e 'foreach (@INC) {
    print `find $_ -type f -name "*.pm"`;
 }'
于 2014-08-16T03:02:37.870 回答
0

为@user80168 的解决方案喝彩(我还在数\'s !)但要避免所有与别名和外壳有关的转义:

%~/ 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需要安装它(它不是核心模块)。

于 2015-02-21T20:49:21.053 回答