हम देखेंगे कि कैसे इस सरणी की सामग्री का निर्माण किया जाता है और प्रभावित करने के लिए हेरफेर किया जा सकता है जहां पर्ल दुभाषिया को मॉड्यूल फाइलें मिलेंगी।
चूक @INC
पर्ल दुभाषिया एक विशिष्ट @INCडिफ़ॉल्ट मान के साथ संकलित किया जाता है । इस मान को जानने के लिए, चलाने के env -i perl -Vआदेश ( env -iपर ध्यान नहीं देता PERL5LIBपर्यावरण चर - देखने के # 2) और उत्पादन में आप कुछ इस तरह देखेंगे:
$ 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
.
नोट .अंत में; यह वर्तमान निर्देशिका है (जो स्क्रिप्ट की निर्देशिका के समान आवश्यक नहीं है)। यह पर्ल 5.26+ में गायब है, और जब पर्ल के साथ चलता है -T( दागी जाँच सक्षम) ।
पर्ल बाइनरी संकलन को कॉन्फ़िगर करते समय डिफ़ॉल्ट पथ को बदलने के लिए, कॉन्फ़िगरेशन विकल्प सेट करें otherlibdirs:
Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3
पर्यावरण चर PERL5LIB(या PERLLIB)
Perl आपके शेल के पर्यावरण चर (यदि यह परिभाषित नहीं किया गया है, इसका उपयोग किया जाता है) @INCमें निहित निर्देशिकाओं (बृहदान्त्र-अलग) की एक सूची के साथ प्री-पेंड PERL5LIBकरता है 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 कमांड लाइन विकल्प
निर्देश-पंक्ति विकल्प के @INCमूल्य के रूप में पारित निर्देशिकाओं की एक सूची (बृहदान्त्र-पृथक) के साथ पर्ल प्री-पेंड -Iहोता है। यह तीन तरीकों से किया जा सकता है, हमेशा की तरह पर्ल विकल्पों के साथ:
इसे कमांड लाइन पर पास करें:
perl -I /my/moduledir your_script.pl
इसे अपनी पर्ल स्क्रिप्ट की पहली पंक्ति (शेबंग) से गुज़ारें:
#!/usr/local/bin/perl -w -I /my/moduledir
PERL5OPT(या PERLOPT) पर्यावरण चर के भाग के रूप में इसे पास करें (देखें प्रोग्रामिंग पर्ल में अध्याय 19.02 )
इसे प्राग्म के माध्यम से पास करेंlib
पर्ल प्री-पेंड्स की @INCएक सूची के साथ इसमें से होकर गुजरा use lib।
एक कार्यक्रम में:
use lib ("/dir1", "/dir2");
कमांड लाइन पर:
perl -Mlib=/dir1,/dir2
आप के माध्यम से@INCno lib भी निर्देशिकाओं को हटा सकते हैं ।
आप सीधे @INCएक नियमित पर्ल सरणी के रूप में हेरफेर कर सकते हैं ।
नोट: चूंकि @INCसंकलन चरण के दौरान उपयोग किया जाता है, इसलिए इसे एक BEGIN {}ब्लॉक के अंदर किया जाना चाहिए , जो use MyModuleकथन से पहले होता है ।
शुरुआत के माध्यम से निर्देशिकाओं को जोड़ें unshift @INC, $dir।
निर्देशिका को अंत तक जोड़ें push @INC, $dir।
एक पर्ल सरणी के साथ आप कुछ भी कर सकते हैं।
नोट: निर्देशिका रहे unshifted पर @INCइस जवाब में सूचीबद्ध क्रम में, उदाहरण के लिए डिफ़ॉल्ट @INCसूची में अंतिम है, से पहले PERL5LIB, से पहले -I, से पहले use libऔर प्रत्यक्ष @INCहेरफेर, बाद के दो मिश्रित जो भी आदेश में वे पर्ल कोड में हैं।
संदर्भ:
@INCस्टैक ओवरफ्लो पर एक व्यापक एफएक्यू-टाइप पोस्ट नहीं लगता है , इसलिए यह प्रश्न एक के रूप में है।
प्रत्येक दृष्टिकोण का उपयोग कब करें?
यदि निर्देशिका में मॉड्यूल को आपकी साइट पर कई / सभी लिपियों द्वारा उपयोग करने की आवश्यकता होती है, विशेष रूप से कई उपयोगकर्ताओं द्वारा चलाए जाते हैं, तो उस निर्देशिका को @INCपर्ल बाइनरी में संकलित डिफ़ॉल्ट में शामिल किया जाना चाहिए ।
यदि निर्देशिका में मॉड्यूल विशेष रूप से उपयोगकर्ता द्वारा चलाए जाने वाले सभी लिपियों के लिए एक विशिष्ट उपयोगकर्ता द्वारा उपयोग किया जाएगा (या यदि पर्ल पुनर्प्राप्त करना @INCपिछले उपयोग के मामले में डिफ़ॉल्ट बदलने का विकल्प नहीं है ), तो उपयोगकर्ताओं को सेट करें PERL5LIB, आमतौर पर उपयोगकर्ता लॉगिन के दौरान।
नोट: कृपया सामान्य यूनिक्स पर्यावरण चर नुकसान के बारे में पता होना चाहिए - उदाहरण के लिए कुछ मामलों में स्क्रिप्ट चलाने के रूप में एक विशेष उपयोगकर्ता उन्हें उस उपयोगकर्ता के वातावरण के साथ चलने की गारंटी नहीं देता है, उदाहरण के माध्यम से su।
यदि निर्देशिका में मॉड्यूल को केवल विशिष्ट परिस्थितियों में उपयोग करने की आवश्यकता होती है (उदाहरण के लिए जब स्क्रिप्ट (ओं) को विकास / डिबग मोड में निष्पादित किया जाता है, तो आप या तो PERL5LIBमैन्युअल रूप से सेट कर सकते हैं , या -Iपर्ल को विकल्प पास कर सकते हैं ।
यदि मॉड्यूल को केवल विशिष्ट स्क्रिप्ट के लिए उपयोग करने की आवश्यकता है, तो सभी उपयोगकर्ताओं द्वारा उनका उपयोग करते हुए, प्रोग्राम में ही उपयोग use lib/ no libप्रचार करें । इसका उपयोग तब भी किया जाना चाहिए जब खोज की जाने वाली निर्देशिका को रनटाइम के दौरान गतिशील रूप से निर्धारित करने की आवश्यकता होती है - जैसे स्क्रिप्ट की कमांड लाइन मापदंडों या स्क्रिप्ट के पथ से ( बहुत अच्छा उपयोग मामले के लिए फाइंडबिन मॉड्यूल देखें )।
अगर निर्देशिका में @INC को कुछ जटिल तर्क के अनुसार हेरफेर करने की आवश्यकता होती है, तो use lib/ no libप्रैग्मस के संयोजन द्वारा लागू करने में बहुत ही असंभव है , तो ब्लॉक के अंदर या हेरफेर के लिए निर्दिष्ट एक विशेष उद्देश्य पुस्तकालय के @INCअंदर प्रत्यक्ष हेरफेर का उपयोग करें , जिसका उपयोग उनकी स्क्रिप्ट द्वारा किया जाना चाहिए (एस) से पहले किसी भी अन्य मॉड्यूल का उपयोग किया जाता है।BEGIN {}@INC
इसका एक उदाहरण स्वचालित रूप से ठेस / उट / देव निर्देशिका में पुस्तकालयों के बीच स्विच कर रहा है, अगर यह देव और / या यूएटी से गायब है तो ठंढ में पुस्तकालय पुस्तकालय पिकअप के साथ (अंतिम स्थिति मानक "उपयोग लिब + फाइंडबिन" समाधान को काफी जटिल बनाता है।) इस परिदृश्य की विस्तृत चित्रण में है कैसे मैं बीटा पर्ल स्क्रिप्ट से बीटा पर्ल मॉड्यूल उपयोग करते हैं? ।
सीधे जोड़ तोड़ के लिए एक अतिरिक्त उपयोग मामला @INCसबरूटीन संदर्भ या ऑब्जेक्ट रेफरेंस को जोड़ने में सक्षम होना है (हां, वर्जीनिया, @INCकस्टम पर्ल कोड हो सकता है और न केवल निर्देशिका नाम, जैसा कि समझाया गया है जब @INC में एक सबरूटीन संदर्भ कहा गया है? )।