2009-04-29 9 views
10

필자는 사용 가능한 일부 모듈에 의존하는 작은 Perl 스크립트를 작성하고 있습니다. 따라서 설치 중에 모든 것이 있는지 확인해야합니다. use some::module을 작성하고 오류가 발생하는지 확인할 수 있지만 "몇 가지를 설치해야합니다 :: 모듈"과 같은 짧은 메시지는 최종 사용자에게 더 도움이됩니다.Perl 모듈이 설치되었는지 어떻게 확인합니까?

나는 또한 @INC의 모든 디렉토리를 검색 할 수 있지만 Perl이므로 더 쉬운 방법이 있습니다.

+1

펄 모듈이 설치되어 있는지 확인하는 방법은 질문이 아닙니다. 그것은 진술입니다. – cjk

답변

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

아, 질문을 잘못 읽었습니다. 일회성으로 알고 싶다고 생각했는데 복구 할 수없는 방식으로 발견하지 못했습니다.

sub try_load { 
    my $mod = shift; 

    eval("use $mod"); 

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

이 같이 사용합니다 :

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

여기에 eval은 두 가지 의무가 있습니다. 즉, 임의의 모듈을 검사 할 수 있으며 use 문이 BEGIN 블록으로 바뀌지 못하게하는 것입니다. 단점은 이와 같은 코드를 작성했지만 특정 모듈에 대해 하드 코드 된 경우에도 여전히 문자열 기반 평가를 사용한다는 것입니다. – chaos

+1

나는 bash에서 이것을 알아 내고 싶기 때문에 당신의 대답을 좋아했지만, 나는 논쟁이 필요한 모듈에 문제가있다. 예 : [jens @ ca60c173 (perl) p] $ perl -MPackage :: DeprecationManager -e ';' -e 라인 0에서 Package :: DeprecationManager를 가져올 때 해시 참조 -deprecations 매개 변수를 제공해야합니다. –

3

방법에 대해 :

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"; 
} 

:

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

사용을 모방하고 끝에 하나를 추가하려면 가져 오기를 호출해야합니다. 가져 오기가 유효하지 않으므로 가져 오는 것이 좋습니다. true 값을 반환해야합니다. eval {require Some :: Module; 일부 : 모듈 -> 가져 오기; 1}; 모듈이 본질적으로 어휘 적이기 만하면 (autobox와 같이) 모듈이 eval에서 가져올 것이므로 eval이 끝나면 범위를 벗어나면 충분하지 않습니다. –

1

나는 이런 식으로 뭔가를 사용하는 나는 항상이 같은 것을 사용 하지만 나는 이것을 korn shell f 형태로 더 많이 사용한다. 조정 :

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

스크립트를 어떻게 설치합니까? 표준 Makefile.PL 또는 Build.PL을 사용하는 경우 목록 종속성은 간단합니다.

2

필자의 시스템에있는 모든 Perl 모듈을 나열하는 작은 스크립트가 있습니다.

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

그 foreach 루프 내부에는 다음과 같은 작업이 필요할 수 있습니다.

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

은 내가 cpan 유틸리티를 사용하려면 : 그것은 일부 데이터를 가져 오기 위해 CPAN 미러에 연결해야하기 때문에

% 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] 

이 조금 느릴 수 있습니다, 그러나 나는 또한 지역을 CPAN 미러. :)

관련 문제