문제

Perl 패키지 이름을 파일의 전체 경로로 변환하고 싶습니다.

say package_name_to_path('Foo::Bar::Baz');
/tmp/Foo/Bar/Baz.pm

이 작업을 수행 할 CPAN 모듈이 있다는 것을 알고 있습니까? 다시 찾을 수 없나요?

도움이 되었습니까?

해결책

모듈을로드 한 경우 %inc를 살펴 보지만 Filename으로 수행해야합니다.

say $INC{"Foo/Bar/Baz.pm"};

그렇지 않은 경우 Module :: Util 또는 Module_Info 프로그램을 사용할 수 있습니다. :: info.

$ module_info Module::Build

Name:        Module::Build
Version:     0.30
Directory:   /usr/local/lib/site_perl
File:        /usr/local/lib/site_perl/Module/Build.pm
Core module: no

또는 @inc를 수동으로 통과 할 수 있습니다.

my $module = "Foo::Bar";

# Convert from Foo::Bar to Foo/Bar.pm
my $file   = $module;
$file =~ s{::}{/};
$file .= ".pm";

my $path;
for my $dir (@INC) {
    $path = "$dir/$file";
    last if -r $path;
    $path = undef;
}

say defined $path ? "$module is found at $path" : "$module not found";

(완전히 크로스 플랫폼 솔루션은 슬래시와 결합하는 대신 파일 :: 사양을 사용합니다.)

빠른 모듈을 찾아야하는 경우 perldoc -l Fayland가 언급 한 것처럼 잘 작동하지만 포드가없는 모듈을 찾지 못할 것입니다.

다른 팁

DOH- 방금 기억했습니다.

use Module::Util qw( :all );

$valid = is_valid_module_name $potential_module;

$relative_path = module_path $module_name;

$file_system_path = module_fs_path $module_name;

Perldoc은 파일 이름을 알려줄 수 있습니다.

[fayland@alpha ~]$ perldoc -l Catalyst
/home/fayland/perl5/lib/perl5/Catalyst.pm

또는 모듈을로드 한 후 %Inc를 찾으십시오.

감사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top