2010-02-23 3 views
6

포함 된 모듈의 전체 파일 이름을 얻고 싶습니다.% INC의 키와 값은 플랫폼에 종속적입니까?

package MyTest; 

my $path = join '/', split /::/, __PACKAGE__; 
$path .= ".pm"; 

print "$INC{$path}\n"; 

1; 

$ perl -Ipath/to/module -MMyTest -e0 
path/to/module/MyTest.pm 

는 모든 플랫폼에서 작동합니다 :이 코드를 생각해?

perlvar

해시 %INC는 의 do, require, 또는 use 사업자를 통해 포함 된 각 파일 이름 항목이 포함되어 있습니다. 키는 지정된 파일 이름 ( 모듈 이름이 경로 이름으로 변환 됨)이고 이고 값은 파일의 위치입니다.

이러한 키는 플랫폼에 종속적입니까, 그렇지 않은 것입니까? File::Spec 또는 무엇을 사용해야합니까? 적어도 win32의 ActivePerl은 \ 대신 /을 사용합니다.

업데이트 :%INC은? 플랫폼에 종속적입니까?

+1

경로로 무엇을 하시겠습니까? 더 많은 컨텍스트를 제공하십시오! –

+0

말하자면, 거기에서 더 많은 모듈을 포함하고 싶습니다. – codeholic

답변

2

가 표준 모듈의 점을 감안, Module::Loaded에서 접근 이동 :

sub is_loaded (*) { 
    my $pm  = shift; 
    my $file = __PACKAGE__->_pm_to_file($pm) or return; 

    return $INC{$file} if exists $INC{$file}; 

    return; 
} 

sub _pm_to_file { 
    my $pkg = shift; 
    my $pm = shift or return; 

    my $file = join '/', split '::', $pm; 
    $file .= '.pm'; 

    return $file; 
} 
+1

사실이 코드는 제가 작성한 코드와 같습니다. 그리고이 모듈은 대부분의 플랫폼에서 작동합니다. 고맙습니다. http://www.cpantesters.org/distro/M/Module-Loaded.html#Module-Loaded-0.06'% INC' 값의 이식성에 관해 말할 수 있습니까? – codeholic

+2

@codeholic 어떤 플랫폼을 염두에두고 있습니까? '/'는 Win32에서 유효한 경로 구분자이며, 불쾌한 double-backwhacks보다 훨씬 더 멋지다는 것을 기억하십시오. Windows 명령 쉘의 geb0rken * 인터페이스 *가 당신을 오도하게하지 마십시오. –

+1

가능한 한 크로스 플랫폼 코드로 만들고 싶습니다. CPAN에 게시하기를 고대하고 있습니다. – codeholic

1

여기 또한 아직로드되지 않은 모듈의 작동 합리적으로 강력한 구현입니다.

use File::Find; 
use File::Spec; 

sub pkg2path (*) { 
    my $file = join '[\\\/:]' => 
       map "\Q$_" => 
       split /::|'/ => "$_[0].pm";   # ' 

    /$file$/ and return File::Spec->rel2abs($INC{$_}) 
     for keys %INC; 

    # omit the rest to only find loaded modules 

    my $path; find { 
     no_chdir => 1, 
     wanted => sub { 
      $path = $_ and goto found if /$file$/ 
     } 
    } => @INC; 

    found: File::Spec->rel2abs($path or return) 
} 

say pkg2path Benchmark; 
say pkg2path Devel::Trace; 
+0

동일한 코드는'Module :: Find'에서 더 잘 작성되었습니다. 하지만 그것은 내 질문에 대답하지 않습니다. – codeholic

+0

pkg2path의 첫 번째 줄에 답이 있습니다. 아니요. % INC의 항목이 특정 패턴을 가질 것이라고 신뢰할 수는 없습니다 (% INC는 사용자 쓰기가 가능하기 때문에 만 해당). 그래서 정규식 빌더 (Module :: Find에는 없지만 % INC btw도 사용하지 않습니다)를 작성한 것입니다. 생각하고 질문에 대답 할 시간이 걸린 소수의 사람들에게 감사함을 알았습니다. –

관련 문제