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
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.
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
Çevre değişkeni
PERL5LIB
(ya daPERLLIB
)Perl öncesi pends
@INC
ile bir liste dizinler (virgülle ayrılan) bulunanPERL5LIB
(eğer tanımlı değildirPERLLIB
) 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 .
-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 daPERLOPT
) ortam değişkeni (Programming Perl bölüm 19.02) bir parçası olarak geçmektedir
lib
pragma üzerinden geçmekÖn pends
@INC
dizinlerin listesi ile Perluse lib
üzerinden geçti.Bir program:
use lib ("/dir1", "/dir2");
Komut satırı:
perl -Mlib=/dir1,/dir2
Ayrıca 75**.
Doğrudan Perl düzenli bir dizi olarak
@INC
işleyebilirsiniz.@INC
derleme aşamasında kullanılan bu Yana, buuse MyModule
ifadenin önündekiBEGIN {}
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:
- perldoc perlmod
- perldoc lib
- Perl Module Mechanics - a great guide containing practical HOW-TOs
- How do I 'use' a Perl module in a directory not in
@INC
? - Programming Perl - bölüm 31 bölüm 13, ch 7.2.41
- How does a Perl program know where to find the file containing Perl module it uses?
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ınPERL5LIB
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çinde
use 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 kombinasyonuuse lib
/no lib
parametreleri, kullanımı doğrudan@INC
manipülasyon içindeBEGIN {}
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?).
Nasıl bir Perl programı için komut sat...
Nasıl Perl ile bir dizi için bir dize ...
Nasıl Perl ile bir milisaniye için uyu...
Perl geliştirme için ideal Vim yapılan...
-While(0); C hack önlemek için bazı iy...