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

joe*_*joe 57 perl command-line perl-module

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

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

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

但是,以下执行正常.

perl -e "use XML::Simple "
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

Ala*_*avi 94

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

perldoc -l XML::Simple
Run Code Online (Sandbox Code Playgroud)

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

  • 这仅在模块包含Pod时有效.奇怪但真实. (3认同)
  • 你应该使用`-lm`而不是`-l`.它是相同的,除了它在模块没有POD时也有效. (2认同)
  • 不幸的是,我的服务器上没有安装 perldoc:“您需要安装 perl-doc 软件包才能使用此程序。” (2认同)

Sin*_*nür 39

又快又脏:

$ perl -MXML::Simple -e 1
Run Code Online (Sandbox Code Playgroud)

  • 虽然,如果你想要这个版本,大多数人会说"perl -MModule\999". (3认同)
  • 我经常使用这个,尽管我通常会做一个`-e“ print(\” got it \ n \“)”`` (2认同)
  • 这个答案更适合用于`shell`函数:`if!perl -M $ module -e 1 2>/dev/null; then` (2认同)

Gre*_*con 18

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

perlvar条目%INC:

  • %INC

散列%INC包含用于通过附带的每个文件名的条目do,require或者use运营商.键是您指定的文件名(模块名称转换为路径名),值是找到的文件的位置.该require运营商使用该哈希来确定特定文件是否已经被包含在内.

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


小智 12

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

perl -e 'use DBI;'
Run Code Online (Sandbox Code Playgroud)

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


Sal*_*gar 9

你在那里做的不是递归到目录.它只列出目录根目录中的模块@INC.

该模块XML::Simple将位于其中一条@INC路径下XML/Simple.pm.

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

CPAN解释了如何在此处查找所有模块,请参阅如何查找已安装的模块.


小智 8

如果要快速检查是否已安装模块(至少在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"
Run Code Online (Sandbox Code Playgroud)

然后你可以:

=> modver XML::Simple
No module found

=> modver DBI
Version 1.607
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于 Korn。但说真的,你需要一个爱好。 (2认同)