2008-12-04 71 views

回答

66

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

例子:

$ 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", 
} 
+0

你学到新的东西每天。 – 2008-12-04 19:46:00

1

从我发现,PERL将查找路径内的目录:

perl -le 'print foreach @INC' 

然后,它会看在标准库,然后在当前目录中。

这给你一个搜索顺序。

我来源:

Extending the library path

3

有相当数量的CPAN模块找到这个信息的,最有可能的候选人看起来是模块::查找,模块::其中,和模块: :定位。我可能会用模块去::定位:

use strict; 
use warnings; 
use Module::Locate qw/locate/; 

my $to_find = "Some::Module"; 

print "Perl would use: ", scalar locate($to_find), "\n"; 

在列表上下文中找到返回一些::模块的所有副本发现基于@INC秩序。

编辑: derobert suggests a much better way,哪知%INC已经办完了...这是一个基于模块的解决方案仍然是有用的,如果你想加载它打算从加载的模块之前就知道了。

0

Module::Mapper提供一种方式来走@INC树查找模块:

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

要在%INC变量,它记录它加载的文件名查找您加载的库为dorequireuse。有关详细信息,请参阅perlvar

7

如果模块POD文档,如果你能保证在路径中的perldoc实用工具属于运行脚本相同的Perl,那么这个命令会经常给你的实际文件被人发现:

perldoc -l ModuleName 
3

这里是一个一行(有一个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 
6

perl -M'LWP'-e'use 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', 
0

我使用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)'