我尝试检查一下系统中是否已安装XML::Simple模块。
perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
上述一行代码用于列出我系统中安装的所有模块。然而,它没有列出XML模块。
但是,下面的代码可以正常执行。
perl -e "use XML::Simple "
可能是什么问题?
我尝试检查一下系统中是否已安装XML::Simple模块。
perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
上述一行代码用于列出我系统中安装的所有模块。然而,它没有列出XML模块。
但是,下面的代码可以正常执行。
perl -e "use XML::Simple "
可能是什么问题?
您可以通过以下步骤检查模块的安装路径:
perldoc -l XML::Simple
你的一行代码存在问题,它没有递归遍历目录/子目录。因此,你仅仅得到了实际模块名称作为输出。
-lm
而不是-l
。它们基本相同,只是-lm
也适用于没有POD的模块。 - ikegami简单粗暴:
$ perl -MXML::Simple -e 1
perl -MDigest::SHA -e 1
而不是 perl -Digest::SHA -e 1
。 - Sinan Ünür-e "print( \"got it\n\" )"
。 - Lucasshell
函数中使用:if ! perl -M$module -e 1 2>/dev/null; then
- Stuart Cardallcpan -l
来验证模块,这将有助于丢弃任何后续生成的警告/错误。 - Prashanth$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'
- %INC
%INC
哈希表包含通过do
,require
, 或use
操作符所包含的每个文件的条目。键是您指定的文件名(模块名称转换为路径名),值是找到该文件的位置。require
操作符使用此哈希表来确定是否已经包含了特定文件。如果文件是通过钩子(例如,子例程参考,请参见 require 中这些钩子的描述)加载的,则默认情况下将此钩子插入到
%INC
中以替代文件名。但请注意,钩子可能已经自行设置了 %INC 条目,以提供一些更具体的信息。
如果你想快速检查一个模块是否已安装(至少在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
@INC
目录下根目录中的模块。XML::Simple
将存储在@INC
路径之一下的XML/Simple.pm
中。CPAN
解释了如何找到所有模块,请参见如何找到已安装的模块。while (<@INC>)
这段代码将 @INC 中的路径连接成一个由空格分隔的字符串,然后在该字符串上调用 glob() 函数,除非有文件通配符,否则会遍历由空格分隔的组件。
如果 @INC 中包含带有空格、\、[]、{}、*、? 或 ~ 的路径,则此方法可能不太适用。因此,使用以下安全替代方案似乎没有理由:
for (@INC)
如果您在Windows下运行ActivePerl:
C:\>ppm query *
获取所有已安装模块的列表
C:\>ppm query XML-Simple
检查是否已安装XML::Simple
我相信你的解决方案只会查找@INC数组中每个目录路径的根目录。你需要递归的东西,比如:
perl -e 'foreach (@INC) {
print `find $_ -type f -name "*.pm"`;
}'
$_
;如果它包含空格,它会在单词处中断;如果它包含 ;
,它会破坏命令(shell注入)- 使用 String::ShellQuote
或不太优化的解决方案 quotemeta
内置函数来引用。 - amphetamachine