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 @INCvarsayılan değerle derlenir . Bu değeri bulmak için, env -i perl -Vkomutu çalıştırın ( çevresel değişkeni env -iyoksayar 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) @INCbulunan 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ğindePERL5LIBPERLLIB@INCPERL5LIBPERLLIBperl -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 , -Ikomut 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 libgeç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 @INCyoluylano lib .
Doğrudan @INCdüzenli bir Perl dizisi olarak manipüle edebilirsiniz .
Not: @INCDerleme 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 @INCbu cevap listelenen sırada, mesela varsayılan @INCöncesinde listede, son olup PERL5LIBöncesinde, -I, öncesinde use libve doğrudan@INC onlar Perl kodu vardır sipariş hangisi içinde manipülasyon, son iki karışık.
Referanslar:
Kapsamlı görünmüyor @INCStack 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, PERL5LIBmanuel 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 libpragmas 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 ).
@INCBazı karmaşık mantığa göre manipüle edilmesi gereken dizinlerin use lib/ no libpragmas kombinasyonu ile uygulanamayacak kadar zor olması imkansızsa , @INCiç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 @INCaltprogram referansları veya nesne referanslarını (evet, Virginia eklemek mümkün olmaktır @INCaçıklandığı gibi özel Perl kodu ve sadece dizin adları içerebilir denilen @ INC bir altprogram başvuru olduğunda? ).