हम देखेंगे कि कैसे इस सरणी की सामग्री का निर्माण किया जाता है और प्रभावित करने के लिए हेरफेर किया जा सकता है जहां पर्ल दुभाषिया को मॉड्यूल फाइलें मिलेंगी।
चूक @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
आप के माध्यम से@INC
no 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 में एक सबरूटीन संदर्भ कहा गया है? )।