trong Perl, khi tôi làm use <module name> <ver>;
, hệ thống tìm thấy tệp .pm
cho thư viện ở đâu đó trong đường dẫn @INC
.Làm cách nào để tìm tệp Perl nào được tải khi tôi sử dụng mô-đun?
Có cách nào đáng tin cậy để tệp thực sự được tải không?
trong Perl, khi tôi làm use <module name> <ver>;
, hệ thống tìm thấy tệp .pm
cho thư viện ở đâu đó trong đường dẫn @INC
.Làm cách nào để tìm tệp Perl nào được tải khi tôi sử dụng mô-đun?
Có cách nào đáng tin cậy để tệp thực sự được tải không?
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",
}
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:
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ừ đó.
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
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.
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
đâ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
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',
Bạn có thể sử dụng lệnh instmodsh: http://perldoc.perl.org/instmodsh.html.
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)'
Bạn học được điều gì mới hàng ngày. –
perl -MData :: Dump = pp -e 'pp (\% INC)' –
Phiên bản của bạn thắng trong sân golf :-D – derobert