2010-02-23 18 views
6

Dahili bir modülün tam dosya adını almak istiyorum.% INC platformuna bağlı anahtarlar ve değerler var mı, değil mi?

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 

tüm platformlar üzerinde çalışacak mı: Bu kodu düşünün?

perlvar

karma %INC için do, require veya use operatör ile birlikte, her dosya girişleri içerir. anahtarı, belirttiğiniz dosya adıdır ( , yol adlarına dönüştürülmüş modül adları ile), ve değer, dosyasının bulunduğu yerdir.

Bu tuşlar platform bağımlı mı değil mi? File::Spec mu kullanmalıyım? Win32'deki en azından ActivePerl, \ yerine / kullanır.

Güncelleme:%INC değerleri hakkında ne düşünüyorsunuz? Platform bağımlı mı?

+1

Yoluyla ne yapmak istersiniz? Lütfen daha fazla bağlam sağlayın! –

+0

Say, oradan daha fazla modül eklemek istiyorum. – codeholic

cevap

2

standart bir modül var olduğu göz önüne alındığında, Module::Loaded gelen yaklaşımla gidin:

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

Aslında bu, yazdığım kodun aynısı. Ve öyle görünüyor ki, bu modül çoğu platformda çalışır. Teşekkür ederim. http://www.cpantesters.org/distro/M/Module-Loaded.html#Module-Loaded-0.06% INC değerlerinin taşınabilirliği hakkında bir şey söyleyebilir misiniz? – codeholic

+2

@codeholic Aklında hangi platformlar var? Unutmayın ki, '/' Win32 üzerinde geçerli bir yol ayırıcısı ve iğrenç çift arkadan çok daha güzel görünüyorsun. Windows komut kabuğunun geb0rken * arabiriminin * sizi yanıltmasına izin vermeyin. –

+1

Mümkün olduğunca çapraz platform kodu yapmak istiyorum, çünkü CPAN'a nihayet postalamak için sabırsızlanıyorum. – codeholic

1

Burada da henüz yüklenmediği modülleri için çalışacak bir makul sağlam uygulama bu.

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

Aynı kod, 'Module :: Find' içinde daha iyi yazılmıştır. Ama soruma cevap vermiyor. – codeholic

+0

pkg2path'in ilk satırı cevabınıza sahiptir. hayır,% INC içindeki girdilerin belirli bir desene sahip olacağına güvenmek güvenli değildir (yalnızca% INC kullanıcının yazılabilir olması nedeniyle). Bu yüzden regex oluşturucuyu yazdım (Module :: Find'da bulunmadı ve% INC btw'yi bile kullanmıyor). Düşünmek için zaman alan ve sorunuzu cevaplayan birkaç kişiyi takdir ettiğinize sevindim. –

İlgili konular