पर्ल दुभाषिया (जो आपके पर्ल प्रोग्राम चलाता है) मॉड्यूल युक्त फ़ाइल की खोज के लिए @INC
नामक एक विशेष सरणी का उपयोग करेगा।
@INC
सरणी में प्रत्येक मान एक निर्देशिका नाम है (लेकिन से नीचे नोट देखें); पर्ल नीचे निर्दिष्ट नियमों का उपयोग करके लूप में उन निर्देशिकाओं के भीतर खोज करेगा। (कृपया this SO post for details of how the contents of @INC are determined देखें)।
यदि मॉड्यूल की फ़ाइल @INC
को समाप्त करने के बाद नहीं मिली है, तो प्रोग्राम का संकलन एक त्रुटि के साथ निरस्त कर दिया जाएगा। यदि मॉड्यूल की फ़ाइल @INC
में निर्दिष्ट निर्देशिकाओं में से एक में पाई जाती है, तो खोज शेष @INC
को देखे बिना समाप्त हो जाती है।
रास्ता पर्ल @INC
में सूचीबद्ध निर्देशिका में से प्रत्येक के भीतर एक मॉड्यूल फ़ाइल के लिए खोज करता इस प्रकार है:
सबसे पहले, यह मॉड्यूल का नाम के श्रेणीबद्ध घटकों (::
द्वारा अलग शब्द), अलग में होगा अंतिम घटक - जिसका उपयोग फ़ाइल नाम बनाने के लिए किया जाएगा - और एक पदानुक्रम पथ (अंतिम ::
से पहले के सभी घटक)।
यदि मॉड्यूल नाम में केवल एक घटक है (::
, उदाहरण के लिए MyModule1
), पदानुक्रम पथ खाली है और फ़ाइल नाम मॉड्यूल का नाम है। इस प्रश्न में दूसरे उदाहरण में, अंतिम घटक MyModule2
है और पदानुक्रम पथ This::Here
होगा।
अपेक्षित फ़ाइल नाम मॉड्यूल नाम के अंतिम घटक को .pm
एक्सटेंशन के साथ जोड़कर निर्धारित किया जाएगा। जैसे हमारे उदाहरणों में MyModule1.pm
और MyModule2.pm
।
नोट: मॉड्यूल नाम स्पष्ट रूप से यूनिक्स और अन्य ऑपरेटिंग सिस्टम पर संवेदनशील हैं जहां फ़ाइल/निर्देशिका नामकरण केस संवेदनशील है।
मॉड्यूल की निर्देशिका द्वारा निर्धारित किया जाएगा:
@INC
से अगले निर्देशिका लेना - एक उदाहरण
पदानुक्रम लेने के द्वारा उस निर्देशिका की एक उप-निर्देशिका बनाने के रूप में /usr/lib/perl
मान लीजिए मॉड्यूल नाम का पथ (यदि कोई है) और "::" /
के साथ बदल रहा है या ऑपरेटिंग सिस्टम जो भी चरित्र निर्देशिका विभाजक के रूप में उपयोग करता है। हमारे दो उदाहरणों में, पहले मॉड्यूल की खोज /usr/lib/perl
(कोई उप-निर्देशिका नहीं) और दूसरी /usr/lib/perl/This/Here
में की जाएगी।
नोट: ऊपर एक मामूली सरलीकरण है - @INC
may also contain subroutine references and object references, के रूप में अपने कस्टम कोड के बजाय 2 तर्क ऊपर # में विनिर्दिष्ट निर्देशिका में देखने के प्रदर्शन के निर्दिष्ट करता है जो मॉड्यूल लोड। यह कार्यक्षमता बहुत ही कम प्रतीत होती है और यह आलेख मानता है कि संपूर्ण @INC
में केवल निर्देशिकाएं हैं। ("/usr/lib/perl", "/opt/custom/lib")
:
के एक विशिष्ट उदाहरण पर चलते हैं, यह सोचते हैं कि आपके @INC
दो उप-निर्देशिका में शामिल करते हैं।
फिर पर्ल के रूप में इस खोज करेंगे:
==========================================================================
| Module | Try # | File to try
==========================================================================
| MyModule1 | Try 1 | /usr/lib/perl/MyModule1.pm
| MyModule1 | Try 2 | /opt/custom/lib/MyModule1.pm
==========================================================================
| This::Here::MyModule2 | Try 1 | /usr/lib/perl/This/Here/MyModule2.pm
| This::Here::MyModule2 | Try 2 | /opt/custom/lib/This/Here/MyModule2.pm
==========================================================================
कृपया याद करते हैं कि पर्ल दुभाषिया एक बार यह स्थानों में से एक में फ़ाइल पाता खोज करने के लिए कोशिश कर बंद हो जाएगा, अगर फाइल बाद में स्थानों में है देखने के लिए कोशिश कर के बिना भी। जैसे यदि /usr/lib/perl/This/Here/MyModule2.pm
मौजूद है, तो पर्ल /opt/custom/lib/This/Here/MyModule2.pm
के अस्तित्व के बारे में नहीं देखेगा, न ही देखभाल करेगा।
नोट: जब भी पर्ल दुभाषिया require
का उपयोग कर रहा है-पर्ल मॉड्यूल आयात करने के लिए तंत्र की तरह @INC का उपयोग किया जाता है। इसमें शामिल हैं:
require
निर्देश ही
use MyModule
बयान (आवश्यकता के बराबर + आयात)
use base
(बराबर की आवश्यकता के लिए + "@ISA धक्का")
मुझे इस प्रश्न का व्यापक उत्तर नहीं मिला कि मैं लिंक कर सकता हूं, इसलिए मैंने एक बनाने का फैसला किया। यदि नीचे दिए गए उत्तर को जोड़ों/सुधारों की आवश्यकता है, तो कृपया इसे प्राप्त करें :) – DVK