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

时间:2009-06-24 15:29:36

标签: perl command-line perl-module

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

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

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

但是,以下操作正常。

perl -e "use XML::Simple "

可能是什么问题?

10 个答案:

答案 0 :(得分:89)

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

perldoc -l XML::Simple

你的单行问题是,它不是递归遍历目录/子目录。因此,您只能获得实用的模块名称作为输出。

答案 1 :(得分:37)

又快又脏:

$ perl -MXML::Simple -e 1

答案 2 :(得分:17)

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

perlvar上的%INC条目:

  
      
  • %INC
  •   
     

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

     

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

答案 3 :(得分:12)

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

perl -e 'use DBI;'

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

答案 4 :(得分:9)

你在做什么并没有递归到目录中。它只列出@INC目录的根目录中的模块。

模块XML::Simple将位于@INC下的XML/Simple.pm个路径之一。

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

CPAN说明了如何在此处查找所有模块,请参阅How to find installed modules

答案 5 :(得分:7)

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

答案 6 :(得分:3)

  

while(&lt; @ INC&gt;)

这将@C中的路径连接在一个字符串中,用空格分隔,然后在字符串上调用glob(),然后迭代通过空格分隔的组件(除非有文件全局元字符。)< / p>

如果@INC中的路径包含空格,\,[],{},* ,?或〜,则效果不佳 似乎没有理由避免安全的选择:

for (@INC)

答案 7 :(得分:3)

如果您在Windows下运行ActivePerl

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

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

Bravo for @ 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

工作得相当好。

这可能是最简单,最现代的#34;方法,使用Module::Runtime

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

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

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