2009-04-29 46 views
10

Tôi đang viết một tập lệnh Perl nhỏ phụ thuộc vào một số mô-đun có thể có sẵn, vì vậy trong khi cài đặt, tôi sẽ phải kiểm tra xem mọi thứ có ở đó không. Tôi chỉ có thể viết use some::module và xem nếu có lỗi xảy ra, nhưng một thông báo ngắn như "Bạn cần cài đặt một số :: mô-đun" sẽ hữu ích hơn cho người dùng cuối.Làm cách nào để kiểm tra xem mô-đun Perl đã được cài đặt chưa?

Tôi cũng chỉ có thể tìm kiếm mọi thư mục trong @INC, nhưng vì đó là Perl, nên phải có cách dễ dàng hơn.

+1

Cách kiểm tra xem mô-đun perl được cài đặt không phải là một câu hỏi, đó là một câu lệnh. – cjk

Trả lời

19
perl -MSome::Module -e ';' 

Rất tiếc, đã đọc câu hỏi. Tôi nghĩ rằng bạn muốn biết trong một trường hợp một lần, không phát hiện ra nó một cách có thể phục hồi. Tôi luôn luôn sử dụng một cái gì đó như thế này:

sub try_load { 
    my $mod = shift; 

    eval("use $mod"); 

    if ([email protected]) { 
    #print "\[email protected] = [email protected]\n"; 
    return(0); 
    } else { 
    return(1); 
    } 
} 

nào bạn sử dụng như thế này:

$module = 'Some::Module'; 
if (try_load($module)) { 
    print "loaded\n"; 
} else { 
    print "not loaded\n"; 
} 
+1

Bạn muốn lưu ý ở đây rằng eval đang làm nhiệm vụ gấp đôi: nó cho phép bạn kiểm tra một mô-đun tùy ý, và nó ngăn cản các tuyên bố sử dụng từ việc biến thành một khối BEGIN. Upshot là, nếu bạn đã viết mã như thế này nhưng mã hóa cứng cho một mô-đun cụ thể, bạn vẫn sẽ sử dụng eval dựa trên chuỗi. – chaos

+1

Tôi thích câu trả lời của bạn, vì tôi muốn tìm ra điều này từ bash, tuy nhiên, tôi gặp rắc rối với các mô-đun cần một đối số. ví dụ. [jens @ ca60c173 (perl) p] $ perl -MPackage :: Ngừng sử dụngManager -e ';' Bạn phải cung cấp tham số -deprecations tham chiếu băm khi nhập gói :: DeprecationManager tại -e line 0. –

3

Làm thế nào về:

die "Some::Module missing!" unless(eval{require Some::Module}); 
+1

Bạn cần gọi nhập nếu bạn định bắt chước và sử dụng một kết quả cuối cùng là một ý tưởng hay vì nhập không bắt buộc phải trả về giá trị thực: eval {require Some :: Module; Một số :: Module-> nhập khẩu; 1}; Điều này cũng sẽ không đủ nếu các mô-đun là từ vựng trong tự nhiên (như autobox) vì nó sẽ nhập khẩu trong eval sau đó đi ra khỏi phạm vi khi eval kết thúc. –

1

tôi sử dụng một cái gì đó như thế này:

BEGIN { 
    my $module_name = shift; # @ARGV 
    our $module_exp = $module_name; 
    eval "use $module_name;"; 
} 

$module_exp =~ s{::}{/}g; 
foreach my $key (grep { m/^$module_exp\./ } keys %INC) { 
    print "$key => $INC{$key}\n"; 
} 

Nhưng tôi sử dụng nó nhiều hơn dưới dạng một vỏ korn f unction:

function wherperl 
{ 
    perl -M$1 <<EX_DOC 
    my \$module = '$1'; 
    \$module =~ s/::/\\//g; 

    for (keys %INC) { 
     next unless m/^\$module\./; 
     print \$_ . ' => ' . \$INC{\$_} . "\n"; 
    } 
EX_DOC 
} 
3

Bạn cài đặt tập lệnh của mình như thế nào? Nếu bạn đang sử dụng một tiêu chuẩn Makefile.PL hoặc Build.PL, liệt kê các phụ thuộc là tầm thường.

2

Tôi có một tập lệnh nhỏ liệt kê tất cả các mô-đun Perl trên hệ thống của tôi;

#!/usr/bin/perl 

use ExtUtils::Installed; 
my $instmod = ExtUtils::Installed->new(); 
foreach my $module ($instmod->modules()) { 
    my $version = $instmod->version($module) || "???"; 
    print "$module -- $version\n"; 
} 

Bên trong vòng lặp foreach bạn có thể muốn làm một số việc như;

my $match; 
if ($module =~ /$match/) { 
    print "Found $match: $module\n"; 
} 
1

Tôi thích sử dụng các cpan tiện ích:

% cpan -D YAML 
YAML 
------------------------------------------------------------------------- 
    YAML Ain't Markup Language (tm) 
    A/AD/ADAMK/YAML-0.70.tar.gz 
    /usr/local/perls/perl-5.10.0/lib/site_perl/5.10.0/YAML.pm 
    Installed: 0.68 
    CPAN:  0.70 Not up to date 
    Ingy dot Net (INGY) 
    [email protected] 

Đây có thể là một chút chậm vì nó có để kết nối với một gương CPAN để lấy một số dữ liệu, nhưng tôi cũng có một địa phương Gương CPAN. :)

Các vấn đề liên quan