पर्ल का @INC का निर्माण कैसे किया जाता है? (उर्फ पर्ल मॉड्यूल की खोज के लिए प्रभावित होने के सभी तरीके क्या हैं?)


199

पेरल मॉड्यूल की खोज के लिए प्रभावित करने के सभी तरीके क्या हैं? या, पर्ल का @INC का निर्माण कैसे किया जाता है ?

जैसा कि हम जानते हैं, पर्ल@INC , डायरेक्टरी नामों वाली सरणी का उपयोग करता है , यह निर्धारित करने के लिए कि पर्ल मॉड्यूल फ़ाइलों की खोज कहाँ की जाए

StackOverflow पर एक व्यापक "@INC" अक्सर पूछे जाने वाले प्रश्न-प्रकार की पोस्ट नहीं लगती है, इसलिए यह प्रश्न एक है।


7
हाँ, लेकिन search.cpan.org/perldoc/… पर पूरी तरह से अच्छा है ?
भीड़

3
@ मोब्रुले: मुझे नहीं लगता कि यह कहीं भी व्यापक है - यह सिर्फ @INCरनटाइम में जोड़ना है, पूर्ण निर्माण नहीं।
कैस्केबेल

2
@mobrule - @ जेफ्रोमी ने सही अनुमान लगाया - किसी भी और सभी संदर्भों के साथ मुख्य समस्या जो मुझे अब तक मिली है, जिसमें पर्ल बाइनरी के संकलित-इन डिफ़ॉल्ट @INC पर व्यापक जानकारी की कमी थी
DVK

3
कुछ मुझे पैच भेजकर उस जवाब को व्यापक बना सकते हैं। यह आसान है क्योंकि पेरथलैक गिथब में है। :)
ब्रायन डी फ़ो

1
ठीक है, "पर्ल बाइनरी के संकलित-इन डिफ़ॉल्ट @INC" पर व्यापक जानकारी यह है कि यह वह व्यक्ति है जिसने संकलित किया है। अगर आपके रास्ते में आने वाले विभिन्न रास्तों के बारे में पूछते हैं, तो मुझे लगता है कि आपके पास आपके द्वारा दिए गए उत्तर की तुलना में एक अलग प्रश्न है।
ब्रायन डी फ़ो

जवाबों:


254

हम देखेंगे कि कैसे इस सरणी की सामग्री का निर्माण किया जाता है और प्रभावित करने के लिए हेरफेर किया जा सकता है जहां पर्ल दुभाषिया को मॉड्यूल फाइलें मिलेंगी।

  1. चूक @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

  1. पर्यावरण चर 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
     .
  2. -I कमांड लाइन विकल्प

    निर्देश-पंक्ति विकल्प के @INCमूल्य के रूप में पारित निर्देशिकाओं की एक सूची (बृहदान्त्र-पृथक) के साथ पर्ल प्री-पेंड -Iहोता है। यह तीन तरीकों से किया जा सकता है, हमेशा की तरह पर्ल विकल्पों के साथ:

    • इसे कमांड लाइन पर पास करें:

      perl -I /my/moduledir your_script.pl
    • इसे अपनी पर्ल स्क्रिप्ट की पहली पंक्ति (शेबंग) से गुज़ारें:

      #!/usr/local/bin/perl -w -I /my/moduledir
    • PERL5OPT(या PERLOPT) पर्यावरण चर के भाग के रूप में इसे पास करें (देखें प्रोग्रामिंग पर्ल में अध्याय 19.02 )

  3. इसे प्राग्म के माध्यम से पास करेंlib

    पर्ल प्री-पेंड्स की @INCएक सूची के साथ इसमें से होकर गुजरा use lib

    एक कार्यक्रम में:

    use lib ("/dir1", "/dir2");

    कमांड लाइन पर:

    perl -Mlib=/dir1,/dir2

    आप के माध्यम से@INCno lib भी निर्देशिकाओं को हटा सकते हैं ।

  4. आप सीधे @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 में एक सबरूटीन संदर्भ कहा गया है? )।


1
PERLOPT मत भूलना, जहाँ आप सेट कर सकते हैं -I। इसके अलावा, बेस .pm और स्थानीय :: जैसे चीजें उन चीजों का उपयोग करती हैं जिन्हें आपने स्पष्ट रूप से सूचीबद्ध किया है।
ब्रायन डी फ़ो

1
@ ब्रायन - उपयोग :: आधार इसका उपयोग "आवश्यकता" के कारण, IIRC के नीचे करता है। मैं स्थानीय से परिचित नहीं हूँ :: lib, यह समझने के लिए और अधिक पढ़ने की आवश्यकता होगी कि यह क्या है
DVK

3
इसके अलावा, यह वास्तव में अच्छा जवाब देने के लिए, आपको लोगों को यह बताने की आवश्यकता है कि उन्हें कब हर एक का उपयोग करना चाहिए। बस उन्हें 10 विकल्प दिए गए कि वे कैसे मददगार नहीं हो सकते। :)
ब्रायन डी फ़ो

पुनश्च कोई भी, कृपया एक दूसरे वास्तुकला-विशिष्ट निर्देशिका को शामिल करने के लिए -I / उपयोग परिवाद को शामिल करने के लिए उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। मैंने बाद में खुद ऐसा करने की योजना बनाई, लेकिन अब इसके लिए ऑफ़लाइन होने की आवश्यकता है।
डीवीके

@brian - PERLOPT जोड़ा गया। मुझे ऐसा लग रहा है कि आधार। पीएम और अन्य "जब @INC का उपयोग किया जाता है" आइटम @ INC / खोज मॉड्यूल फ़ाइलों के लिए अधिक अनुकूल हैं जिन्हें मैंने पोस्ट किया था और यहां से लिंक किया गया था, इसलिए मैंने इसे वहां रखा।
डीवीके

18

ऊपर सूचीबद्ध स्थानों के अलावा, पर्ल के ओएस एक्स संस्करण में दो और तरीके भी हैं:

  1. /Library/Perl/x.xx/AppendToPath फ़ाइल। इस फ़ाइल में सूचीबद्ध पथ रनटाइम पर @INC में संलग्न हैं।

  2. /Library/Perl/x.xx/PrependToPath फ़ाइल। इस फ़ाइल में सूचीबद्ध पथ रनटाइम पर @INC के लिए तैयार किए गए हैं।


6

जैसा कि पहले ही कहा गया था कि @INC एक सरणी है और आप जो कुछ भी चाहते हैं उसे जोड़ने के लिए स्वतंत्र हैं।

मेरी CGI REST स्क्रिप्ट इस प्रकार है:

#!/usr/bin/perl
use strict;
use warnings;
BEGIN {
    push @INC, 'fully_qualified_path_to_module_wiht_our_REST.pm';
}
use Modules::Rest;
gone(@_);

चला गया सबरूटीन Rest.pm द्वारा निर्यात किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.