SORU
26 Mart 2010, Cuma


Nasıl Perl'in @INC kurulur? (aka Perl modülleri için aranır nereye etkileyen tüm yolları nelerdir?)

Perl modülleri için aranır nereye etkileyen tüm yollar nelerdir? ya da,Nasıl Perl @INC yapılmış?

Biliyoruz, Perl uses *6* array containing directory names to determine where to search for Perl module files gibi.

Kapsamlı olması için hiçbir sebep yok "@INC bu soru hazırlanmıştır" SSS-tip olarak StackOverflow sonrası.

CEVAP
26 Mart 2010, Cuma


Bu dizinin içeriğini inşa edilir ve Perl yorumlayıcı modülü dosyaları bulamayacağı bir yere etkilemek için manipüle edilebilir nasıl bakacağız.

  1. Varsayılan @INC

    Perl yorumlayıcısı compiled with a specific @INC default value. Bu değeri bulmak için, env -i perl -V komut (env -i PERL5LIB ortam değişkeni yok sayıyor - #2) çalıştırmak ve çıktı böyle bir şey göreceksiniz:

    $ env -i perl -V
    ...
    @INC:
     /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/site_perl/5.18.0
     /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/5.18.0
     .
    

    Sonunda . not; bu geçerli dizindir. Perl -T (taint checks enabled) ile çalıştığında eksik.

    Perl ikili derleme yapılandırırken varsayılan yolu değiştirmek için, yapılandırma seçeneği otherlibdirs set:

    Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3

  2. Çevre değişkeni PERL5LIB (ya da PERLLIB)

    Perl öncesi pends @INC ile bir liste dizinler (virgülle ayrılan) bulunan PERL5LIB (eğer tanımlı değildir PERLLIB) kullanılan ortam değişkeninin kabuk. PERL5LIB PERLLIB değişkenler devreye ortamı sonra @INC içeriğini görmek için, perl -V çalıştırın.

    $ perl -V
    ...
    %ENV:
      PERL5LIB="/home/myuser/test"
    @INC:
     /home/myuser/test
     /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/site_perl/5.18.0
     /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/5.18.0
     .
    
  3. -I komut satırı seçeneği

    Ön pends @INC dizinler (virgülle ayrılan) bir listesini Perl -I komut satırı seçeneği, değer olarak geçti. Bu her zamanki gibi Perl seçenekleri ile üç şekilde yapılabilir:

    • Komut satırında Pass:

      perl -I /my/moduledir your_script.pl
      
    • İlk satırı (mesele) Perl betiği: üzerinden geçmek

      #!/usr/local/bin/perl -w -I /my/moduledir
      
    • PERL5OPT (ya da PERLOPT) ortam değişkeni (Programming Perl bölüm 19.02) bir parçası olarak geçmektedir

  4. lib pragma üzerinden geçmek

    Ön pends @INC dizinlerin listesi ile Perl use lib üzerinden geçti.

    Bir program:

    use lib ("/dir1", "/dir2");
    

    Komut satırı:

    perl -Mlib=/dir1,/dir2
    

    Ayrıca 75**.

  5. Doğrudan Perl düzenli bir dizi olarak @INC işleyebilirsiniz.

    @INC derleme aşamasında kullanılan bu Yana, bu use MyModule ifadenin önündeki BEGIN {} bir blok içinde yapılması gerekir. not:

    • unshift @INC, $dir ile başlayan dizinleri ekleyin.

    • push @INC, $dir ile sonuna dizinleri ekleyin.

    • Perl bir dizi ile yapabileceğiniz başka bir şey yapmak.

Not: dizin varelenmemişüzerine @INC içinde listelenen sırada bu yanıt, örneğin, varsayılan @INC son liste, önlerine PERL5LIB önce -I, önlerine use lib doğrudan @INC manipülasyon, son iki karışık hangisi düzen var Perl kodu.

Referanslar:

Yığın Taşması @INC SSS-tür kapsamlı bir yazı olması için hiçbir sebep yok, bu soru olarak hazırlanmıştır.

Her bir yaklaşım, ne zaman kullanılır?

  • Eğer modüllerde bir dizin ihtiyacımız olmak üzere, birçok/tüm scriptleri sitenizde, özellikle çalışma ile birden çok kullanıcı, bu dizin olmalıdır dahil varsayılan @INC derlenmiş içine Perl ikili.

  • Eğer modüllerde dizin kullanılacak özel bir belirli bir kullanıcı için tüm komut, bir kullanıcı olarak çalışır (ya da eğer yeniden Perl gibi bir şansımız değiştirmek varsayılan @INC önceki kullanım örneği), set kullanıcıların PERL5LIB genellikle sırasında kullanıcı girişi.

    Not: dikkat edin her zamanki gibi Unıx ortam değişkeni tuzaklar - örneğin, bazı durumlarda çalışan komut dosyaları gibi belirli bir kullanıcı garanti etmez çalışan onlarla kullanıcının ortamı kurmak, örneğin) su.

  • Eğer modüllerde dizin ihtiyacımız olacak eskiden sadece belirli koşullar (örneğin, ne zaman komut dosyası(ler) yürütülen geliştirme/hata ayıklama modu, ya da set PERL5LIB el ile veya pass -I seçeneği için perl.

  • Eğer bu modüller belirli bir komut için kullanılması gereken, tarafındantümkullanıcılar bunları kullanarak, programın kendisi içindeuse lib/no lib parametreleri kullanın. Ayrıca olduğunda kullanılmalıdır dizin için arama ihtiyaçlarını karşılamak üzere dinamik olarak tespit sırasında zamanı - örneğin, komut dosyası komut satırı parametreleri veya betiğin yolunu (FindBin modül için çok güzel bir kullanım örneği).

  • Eğer dizinde @INC gereken ayarlarla oynanmış göre biraz karmaşık mantık da imkansıza çok hantal uygulamak ile kombinasyonu use lib/no lib parametreleri, kullanımı doğrudan @INC manipülasyon içinde BEGIN {} blok veya içinde özel amaçlı bir kütüphane tayin @INC manipülasyon olması gereken kullanılan script(ler) önce tüm diğer modülleri kullanılır.

    Bir örnek, bu otomatik olarak geçiş arasında kütüphanelerde prod/uat/dev dizin, şelale kütüphane kamyonetle prod eğer eksik gelen dev ve/veya UAT (son durum yapar standart "kullanım lib FindBin" çözümü oldukça karmaşık. Bu senaryoyu ayrıntılı bir şekilde How do I use beta Perl modules from beta Perl scripts?.

  • Ek bir kullanım örneği için doğrudan manipülasyonu @INC etmek, eklemek yordam referans veya nesne başvurularını (Evet, Virginia, @INC içerebilir özel Perl Kodu ve sadece dizin isimleri açıkladı When is a subroutine reference in @INC called?).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Authority

    Android Auth

    3 NİSAN 2011
  • majesticdubstep

    majesticdubs

    3 Kasım 2011
  • Semantic Mastery

    Semantic Mas

    30 EKİM 2013