2008-12-04 28 views

Trả lời

66

Có, %INC chứa đường dẫn đầy đủ mà mô-đun được tải.

Ví dụ:

$ 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

Bạn học được điều gì mới hàng ngày. –

+2

perl -MData :: Dump = pp -e 'pp (\% INC)' –

+0

Phiên bản của bạn thắng trong sân golf :-D – derobert

1

Từ những gì tôi thấy, perl sẽ tìm trong các thư mục trong đường dẫn:

perl -le 'print foreach @INC' 

Sau đó, nó sẽ tìm trong các thư viện chuẩn, và sau đó trong thư mục hiện hành.

Điều đó cung cấp cho bạn một đơn đặt hàng tìm kiếm.

nguồn của tôi:

Extending the library path

3

Có một số lượng tốt của các module trong CPAN cho việc tìm kiếm thông tin này, các ứng viên có khả năng nhất tìm được Module :: Tìm, Module :: Trong đó, và Module: :Định vị. Tôi có thể đi với Mô-đun :: Xác định vị trí:

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

my $to_find = "Some::Module"; 

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

Trong ngữ cảnh danh sách, hãy trả về tất cả các bản sao tìm thấy của Một số :: Mô-đun theo thứ tự dựa trên @INC.

Chỉnh sửa: derobert suggests a much better way, tôi đã không nhận ra% INC đã có nó ... Giải pháp dựa trên mô-đun này sẽ vẫn hữu ích nếu bạn muốn biết trước khi tải mô-đun nơi nó sẽ được tải từ đó.

0

Module::Mapper cung cấp một cách để bước đi trên cây @ INC để tìm thấy các module:

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

Bạn muốn nhìn vào %INC biến, trong đó ghi rõ tên tập tin nó nạp cho thư viện bạn tải với do, require hoặc use. Xem perlvar để biết chi tiết.

7

Nếu các mô-đun có tài liệu pod, và nếu bạn có thể đảm bảo rằng các tiện ích perldoc trong PATH của bạn thuộc về perl cùng đang chạy script của bạn, sau đó lệnh này sẽ thường xuyên cung cấp cho bạn các tập tin thực tế được tìm thấy:

perldoc -l ModuleName 
3

đây là một lớp lót (với một wrapper bash) để xác định xem một module được cài đặt - và nơi mà nó sẽ được nạp từ:

#!/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" 

Gọi nó với tên module cú pháp perl của:

./find_perl_module Font::Metrics::Courier 
6

perl -M'LWP '-e' sử dụng Dữ liệu :: Dumper; in Dumper \% INC '| grep LWP

Điều này sẽ liệt kê vị trí mô-đun LWP trên đĩa và cũng liệt kê các mô-đun được tải bên trong 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

tôi sử dụng kịch bản 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)' 
Các vấn đề liên quan