2010-06-04 6 views

답변

0

그냥, 당신은 임의의 펄 코드의 임의 패키지에서 찾고 명확하게하기 위해?

또는 Perl 모듈, 예를 들어. "a/b/c/d1.pm"모듈 "a :: b :: c :: d1"?

두 경우 모두 단일 "사용"문을 사용하여 모두로드 할 수 없습니다.

glob 또는 File::Find을 사용하여 적절한 파일을 모두 찾아야합니다. 첫 번째 경우 (모듈)에서

, 당신은 다음 require 각 파일을 -ing에 의해, 또는 모듈 이름 ( s#/#::#g; s#\.pm$##;)로 파일 이름을 변환 개별적으로 각 모듈에 use를 호출하여 중 하나를로드 할 수 있습니다.

지금까지 임의 펄 파일에 중첩 된 실제 패키지는, 그 패키지가 될 수 : (glob 또는 File::Find를 통해 발견 다시) 각 파일을 grepping 표시 기준

  • /^package (.*);/

  • 실제로로드에 대한 각 파일에 대해 require $file을 실행하십시오.

    이 경우 각 패키지의 패키지 이름은 a/b/c/1.pl입니다. 아니요은 "a :: b :: c"와 관련이 있어야합니다. 예 : 그들은 파일 작성자 "p1", "a :: p1"또는 "a :: b :: c :: p1_something"에 의해 명명 될 수 있습니다. 당신은 당신이 특정 접두사 (a::b::c에서 예를 들어, 모든 것에 경로를 포함에 모든 모듈을로드하려면

1

일반적으로 a/b/c.pl과 같은 스크립트에는 main 이외의 네임 스페이스가 없습니다. 아마도 모듈을 a/b/c.pm과 같은 이름으로 발견하려고 생각했을 것입니다. (나쁜 이름 인 이유는 일반적으로 소문자 패키지 이름이 Perl 내부 용으로 예약되어 있기 때문입니다). 그러나

, 디렉토리 경로 제공, 당신은 File::Find를 사용 잠재적 펄 모듈을 찾아보실 수 있습니다 :

use strict; 
use warnings; 
use File::Find; 
use Data::Dumper; 

my @modules; 
sub wanted 
{ 
    push @modules, $_ if m/\.pm$/ 
} 
find(\&wanted, 'A/B'); 

print "possible modules found:\n"; 
print Dumper(\@modules)' 
7

, 당신은 Module::Find를 사용할 수 있습니다.예를 들어

: 이것은 당신의 @INC 경로가 필요한 디렉토리로 설정되고에 따라

use Module::Find 'useall'; 

my @loaded = useall 'Foo::Bar::Baz'; # loads everything under Foo::Bar::Baz 

, 그래서 (use lib으로, 예를 들어) 필요한 조작을 처음.

1

이 과잉 될 수도 있지만 당신이 변경 무엇 전에 모듈을로드 한 후 기호 테이블을 검사하고 볼 수 있습니다

use strict; use warnings; 
my %original = map { $_ => 1 } get_namespaces("::"); 
require Inline; 
print "New namespaces since 'require Inline' call are:\n"; 
my @new_namespaces = sort grep !defined $original{$_}, get_namespaces("::"); 
foreach my $new_namespace (@new_namespaces) { 
    print "\t$new_namespace\n"; 
} 

sub get_namespaces { 
    # recursively inspect symbol table for known namespaces 
    my $pkg = shift; 
    my @namespace =(); 
    my %s = eval "%" . $pkg; 
    foreach my $key (grep /::$/, keys %s) { 
    next if $key eq "main::"; 
    push @namespace, "$pkg$key", get_namespaces("$pkg$key"); 
    } 
    return @namespace; 
} 

 
New namespaces since 'require Inline' call are: 
     ::AutoLoader:: 
     ::Config:: 
     ::Digest:: 
     ::Digest::MD5:: 
     ::Dos:: 
     ::EPOC:: 
     ::Exporter:: 
     ::Exporter::Heavy:: 
     ::File:: 
     ::File::Spec:: 
     ::File::Spec::Cygwin:: 
     ::File::Spec::Unix:: 
     ::File::Spec::Win32:: 
     ::Inline::Files:: 
     ::Inline::denter:: 
     ::Scalar:: 
     ::Scalar::Util:: 
     ::Socket:: 
     ::VMS:: 
     ::VMS::Filespec:: 
     ::XSLoader:: 
     ::vars:: 
     ::warnings::register:: 
관련 문제