나는 보이는 디렉토리 구조를 가지고 같은 :어떻게 perl의 부분 네임 스페이스에서 패키지를 동적으로 검색합니까?
푸 :: 바 :: 바즈 :: 1 푸 :: 바 :: 바즈 :: 2 등
내가 같은에서 패키지를 나열 할 수 있습니다 :
use Foo::Bar::Baz;
감사합니다!
편집 : 모듈이 무엇인지 분명하게 나타냅니다.
나는 보이는 디렉토리 구조를 가지고 같은 :어떻게 perl의 부분 네임 스페이스에서 패키지를 동적으로 검색합니까?
푸 :: 바 :: 바즈 :: 1 푸 :: 바 :: 바즈 :: 2 등
내가 같은에서 패키지를 나열 할 수 있습니다 :
use Foo::Bar::Baz;
감사합니다!
편집 : 모듈이 무엇인지 분명하게 나타냅니다.
그냥, 당신은 임의의 펄 코드의 임의 패키지에서 찾고 명확하게하기 위해?
또는 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
에서 예를 들어, 모든 것에 경로를 포함에 모든 모듈을로드하려면
일반적으로 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)'
, 당신은 Module::Find를 사용할 수 있습니다.예를 들어
: 이것은 당신의 @INC
경로가 필요한 디렉토리로 설정되고에 따라
use Module::Find 'useall';
my @loaded = useall 'Foo::Bar::Baz'; # loads everything under Foo::Bar::Baz
, 그래서 (use lib
으로, 예를 들어) 필요한 조작을 처음.
이 과잉 될 수도 있지만 당신이 변경 무엇 전에 모듈을로드 한 후 기호 테이블을 검사하고 볼 수 있습니다
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::