Bu dizinin içeriğinin nasıl oluşturulduğuna bakacağız ve Perl yorumlayıcısının modül dosyalarını nerede bulacağını etkileyecek şekilde manipüle edilebileceğine bakacağız.
Varsayılan @INC
Perl yorumlayıcısı belirli bir @INC
varsayılan değerle derlenir . Bu değeri bulmak için, env -i perl -V
komutu çalıştırın ( çevresel değişkeni env -i
yoksayar PERL5LIB
- bakınız # 2) ve çıktıda şö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
.
Not .
sonunda; bu geçerli dizindir (komut dosyasının diziniyle aynı olması gerekmez). Perl 5.26+ ve Perl ile çalıştığında -T
(renk kontrolleri etkin) eksiktir .
Perl ikili derlemesini yapılandırırken varsayılan yolu değiştirmek için yapılandırma seçeneğini ayarlayın otherlibdirs
:
Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3
Çevresel değişken PERL5LIB
(veya PERLLIB
)
Perl , kabuğunuzun ortam değişkeninde ( tanımlanmamışsa, kullanılıyorsa) @INC
bulunan dizinlerin (iki nokta üst üste ayrılmış) bir listesini önceden bekler . İçeriğini görmek için sonra ve , çalışma ortam değişkenleri etkisini gösterdiğindePERL5LIB
PERLLIB
@INC
PERL5LIB
PERLLIB
perl -V
.
$ 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
Perl ön ekler @INC
, -I
komut satırı seçeneğinin değeri olarak iletilen dizinlerin bir listesiyle (iki nokta üst üste ayrılmış) . Bu, Perl seçenekleriyle her zamanki gibi üç şekilde yapılabilir:
Komut satırına iletin:
perl -I /my/moduledir your_script.pl
Perl betiğinizin ilk satırından (shebang) geçin:
#!/usr/local/bin/perl -w -I /my/moduledir
PERL5OPT
(Veya PERLOPT
) ortam değişkeninin bir parçası olarak iletin (bkz. Bölüm 19.02, Perl Programlama )
Pragma yoluyla lib
geçirin
Perl ön ekler @INC
, üzerinden geçirilen dizinlerin bir listesi ileuse lib
.
Bir programda:
use lib ("/dir1", "/dir2");
Komut satırında:
perl -Mlib=/dir1,/dir2
Ayrıca edebilirsiniz gelen dizinleri kaldırmak @INC
yoluylano lib
.
Doğrudan @INC
düzenli bir Perl dizisi olarak manipüle edebilirsiniz .
Not: @INC
Derleme aşamasında kullanıldığından, bu ifadeden BEGIN {}
önce gelen bir blok içinde yapılmalıdır use MyModule
.
Başlangıç noktasına dizinleri ekleyin unshift @INC, $dir
.
Yoluyla dizinleri sonuna ekleyin push @INC, $dir
.
Perl dizisi ile yapabileceğiniz her şeyi yapın.
Not: dizinleri vardır elenmemiş üzerine @INC
bu cevap listelenen sırada, mesela varsayılan @INC
öncesinde listede, son olup PERL5LIB
öncesinde, -I
, öncesinde use lib
ve doğrudan@INC
onlar Perl kodu vardır sipariş hangisi içinde manipülasyon, son iki karışık.
Referanslar:
Kapsamlı görünmüyor @INC
Stack Overflow'da SSS tipi yazı , bu nedenle bu soru bir soru olarak tasarlanmıştır.
Her yaklaşım ne zaman kullanılır?
Bir dizindeki modüllerin, özellikle birden çok kullanıcı tarafından çalıştırılan sitenizdeki pek çok / tüm komut dosyası tarafından kullanılması gerekiyorsa, bu dizin varsayılana dahil edilmelidir @INC
Perl ikili dosyasında derlenen .
Dizindeki modüller yalnızca kullanıcının çalıştırdığı tüm komut dosyaları için belirli bir kullanıcı tarafından kullanılacaksa (veya Perl'i yeniden derlemek varsayılanı değiştirmek için bir seçenek değilse @INC
önceki kullanım durumunda ) PERL5LIB
, genellikle kullanıcı oturum açma sırasında kullanıcıların 'sini ayarlayın.
Not: Lütfen her zamanki Unix ortam değişkeni tuzaklarından haberdar olun - örneğin, belirli durumlarda komut dosyalarını çalıştırmak gibi belirli bir kullanıcı tarafından çalıştırıldığında, bu kullanıcının ortam kurulumuyla çalıştırılacağı garanti edilmez su
.
Dizindeki modüllerin yalnızca belirli durumlarda kullanılması gerekiyorsa (örn. Komut dosyaları geliştirme / hata ayıklama modunda yürütüldüğünde, PERL5LIB
manuel olarak ayarlayabilir veya-I
seçeneği perl'e .
Modüllerin yalnızca belirli komut dosyaları için kullanılması gerekiyorsa, bunları kullanan tüm kullanıcılar tarafından , programın kendisinde use lib
/ no lib
pragmas kullanın . Ayrıca, aranacak dizinin çalışma sırasında dinamik olarak belirlenmesi gerektiğinde de kullanılmalıdır - örneğin komut dosyasının komut satırı parametrelerinden veya komut dosyasının yolundan ( çok güzel kullanım durumu için FindBin modülüne bakın ).
@INC
Bazı karmaşık mantığa göre manipüle edilmesi gereken dizinlerin use lib
/ no lib
pragmas kombinasyonu ile uygulanamayacak kadar zor olması imkansızsa , @INC
içinde doğrudan manipülasyon kullanınBEGIN {}
blok içinde veya özel olarak tasarlanmış özel bir kütüphane içinde@INC
manipülasyon . diğer modüller kullanılmadan önce.
Bunun bir örneği prod / uat / dev dizinlerindeki kütüphaneler arasında otomatik olarak geçiş yapmaktır, dev ve / veya UAT'den eksikse prod'da şelale kütüphanesi alımı (son koşul standart "lib + FindBin kullan" çözümünü oldukça karmaşık hale getirir. Bu senaryonun detaylı illüstrasyon olduğunu ben beta Perl komut beta Perl modülleri kullanırım nasıl? .
Doğrudan işlemek için ek bir kullanım durumunda @INC
altprogram referansları veya nesne referanslarını (evet, Virginia eklemek mümkün olmaktır @INC
açıklandığı gibi özel Perl kodu ve sadece dizin adları içerebilir denilen @ INC bir altprogram başvuru olduğunda? ).