2008-12-04 87 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)'