如何在使用模块时查找Perl加载的文件?

在Perl中,当我use <module name> <ver>; ,系统在@INCpath的某处find库的.pm文件。

有没有一种可靠的方式来实际加载文件?

是的, %INC包含模块加载的完整path。

例:

 $ perl -M'Data::Dump qw(pp)' -e 'pp(\%INC)' { "Data/Dump.pm" => "/usr/share/perl5/Data/Dump.pm", "Exporter.pm" => "/usr/share/perl/5.10/Exporter.pm", "List/Util.pm" => "/usr/lib/perl/5.10/List/Util.pm", "Scalar/Util.pm" => "/usr/lib/perl/5.10/Scalar/Util.pm", "XSLoader.pm" => "/usr/lib/perl/5.10/XSLoader.pm", "overload.pm" => "/usr/share/perl/5.10/overload.pm", "strict.pm" => "/usr/share/perl/5.10/strict.pm", "vars.pm" => "/usr/share/perl/5.10/vars.pm", "warnings.pm" => "/usr/share/perl/5.10/warnings.pm", "warnings/register.pm" => "/usr/share/perl/5.10/warnings/register.pm", } 

如果模块具有pod文档,并且可以保证PATH中的perldoc实用程序与运行脚本的perl属于同一个perl,那么该命令通常会为您提供实际find的文件:

 perldoc -l ModuleName 

perl -M'LWP'-e'使用Data :: Dumper; 打印Dumper \%INC'| grep LWP

这将列出磁盘上的LWP模块位置,并列出LWP内部加载的模块。

  'LWP.pm' => '/usr/lib/perl5/5.10.0/LWP.pm', 'LWP/Protocol.pm' => '/usr/lib/perl5/5.10.0/LWP/Protocol.pm', 'LWP/UserAgent.pm' => '/usr/lib/perl5/5.10.0/LWP/UserAgent.pm', 

您需要查看%INCvariables,该variableslogging了您加载的库文件的名称, requireuse的文件名。 请参阅perlvar的细节。

CPAN中有很多模块用于查找这些信息,最有可能的候选对象是Module :: Find,Module :: Which和Module :: Locate。 我可能会去模块::定位:

 use strict; use warnings; use Module::Locate qw/locate/; my $to_find = "Some::Module"; print "Perl would use: ", scalar locate($to_find), "\n"; 

在列表上下文中,根据@INC定位返回所有find的Some :: Module的副本。

编辑: 德罗伯特build议一个好得多的方法 ,我没有意识到%INC已经有了它…如果你想知道加载模块之前,这个基于模块的解决scheme仍然是有用的。

这是一个单线程(用bash包装器)来确定是否安装了模块 – 以及从哪里加载:

 #!/bin/bash perl -M${1} -le "\$mname=\"${1}.pm\";\$mname=~s#::#/#g;print \"$1 INSTALLED AT \$INC{\$mname}\";" 2>/dev/null || echo "${1} NOT INSTALLED" 

用perl的模块名称语法来调用它:

 ./find_perl_module Font::Metrics::Courier 

从我发现,perl将查找path中的目录:

 perl -le 'print foreach @INC' 

然后它将在标准库中,然后在当前目录中查找。

这给你一个search顺序。

我的来源:

扩展库path

Module :: Mapper提供了一种方法来遍历@INC树来查找模块:

 perl -MModule::Mapper -MData::Dumper \ -e 'print Dumper( find_sources( UseINC => 1, Modules => [ @ARGV ] ) )' \ list-of-modules-to-locate 

您可以使用instmodsh命令: http ://perldoc.perl.org/instmodsh.html。

我使用shell脚本/ usr / local / bin / which_perl_module

 #!/bin/sh if [ ! $1 ];then echo "Which perl module should I look for?"; exit; fi echo -n "You are using: " perldoc -l $1 echo "which I found by looking in:" perl -MData::Dump=pp -e 'unshift @INC, '$1'; pp(\@INC)'