我怎样才能从命令行检查我的系统上是否安装了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包含通过do,require或use操作符包含的每个文件名的条目。 关键是您指定的文件名(将模块名称转换为path名),值是find的文件的位置。require运算符使用这个散列来确定是否已经包含了一个特定的文件。如果文件是通过钩子加载的(例如子程序引用,请参阅这些钩子的描述要求 ),该钩子默认插入
%INC代替文件名。 但是,请注意,挂钩可能已经设置了%INC条目本身来提供一些更具体的信息。
 你在做什么不是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需要安装它(它不是核心模块)。