我怎样才能从命令行检查我的系统上是否安装了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
下的@INC
path之一中。
他上面说的是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
需要安装它(它不是核心模块)。