我怎样才能从命令行检查我的系统上是否安装了Perl模块?

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

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

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

但是,以下执行罚款。

 perl -e "use XML::Simple " 

可能是什么问题?

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

 perldoc -l XML::Simple 

你的单行问题是,它不是recursion遍历目录/子目录。 因此,只有实用的模块名称作为输出。

快速和肮脏:

 $ perl -MXML::Simple -e 1 
  $ perl -MXML :: Simple -le'print $ INC {“XML / Simple.pm”}' 

%INC的perlvar条目:

  • %INC

散列%INC包含通过dorequireuse操作符包含的每个文件名的条目。 关键是您指定的文件名(将模块名称转换为path名),值是find的文件的位置。 require运算符使用这个散列来确定是否已经包含了一个特定的文件。

如果文件是通过钩子加载的(例如子程序引用,请参阅这些钩子的描述要求 ),该钩子默认插入%INC代替文件名。 但是,请注意,挂钩可能已经设置了%INC条目本身来提供一些更具体的信息。

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

 perl -e 'use DBI;' 

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

你在做什么不是recursion到目录中。 它只将模块列在@INC目录的根目录下。

XML::Simple模块将位于XML/Simple.pm下的@INCpath之一中。

他上面说的是find具体的模块。

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

如果要快速检查是否安装了模块(至less在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 

while(<@INC>)

这将@INC中的path连接在一个string中,用空格分隔,然后调用string的glob(),然后遍历由空格分隔的组件(除非存在文件匹配元字符)。

如果@INC中包含空格\,[],{},*,?或〜,那么这种方法不能很好地工作,似乎没有理由避免安全的select:

 for (@INC) 

如果您在Windows下运行ActivePerl :

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

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

我相信你的解决scheme只会看在@INC数组中包含的每个目录path的根目录。 你需要recursion的东西,比如:

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

Bravo for @ user80168的解决scheme(我仍然在计数!),但为了避免涉及别名和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需要安装它(它不是核心模块)。