ऑब्जेक्ट उन्मुख सोचें।
एक्सपोर्टर को केवल मॉड्यूल के रूप में नहीं, बल्कि वर्ग के रूप में सोचें।ISA
के रूप में सोचें "है ए" जैसा कि में है "मेरा मॉड्यूल निर्यातक के उप-वर्ग" है।
आप जो कर रहे हैं वह एक्सपोर्टर क्लास के उप-वर्ग के रूप में आपके मॉड्यूल को घोषित कर रहा है जिसका अर्थ है कि आप एक्सपोर्टर क्लास की import
विधि का उपयोग कर सकते हैं जो कि उपयोगी है।
वास्तव में यह समझाने के लिए कि निर्यातक क्या कर रहा है, आपको समझना होगा कि पर्ल नामस्थान का उपयोग करता है। कल्पना करें कि क्या आपके प्रोग्राम में एक चर है जिसे $total
कहा जाता है, लेकिन आप जिस मॉड्यूल का उपयोग कर रहे हैं वह भी करता है। आपका $total
वैरिएबल मॉड्यूल के $total
चर के साथ हस्तक्षेप करेगा।
इसे रोकने के लिए, पर्ल नामस्थान का उपयोग करता है। आपका प्रोग्राम डिफ़ॉल्ट नामस्थानmain
में संचालित होता है। आपके मॉड्यूल package
फ़ंक्शन का उपयोग एक नया नेमस्पेस घोषित करने के लिए करते हैं। अब, आप और आपका मॉड्यूल सुरक्षित रूप से $total
नामक चर का उपयोग कर सकते हैं। आपके प्रोग्राम में, यह वास्तव में $main::total
है, और पैकेज में, यह $ पैकेज :: नाम :: कुल . If you want to use something from one _namespace_ in another, you can prepend the _namespace_ on it. Think of the
$ फ़ाइल :: ढूंढें :: नाम and
$ फ़ाइल :: खोजें :: डीआईआर variables you have when you use
फ़ाइल :: खोजें '।
निर्यातक की import
विधि क्या है आपके उप-स्थान (और यदि आप चाहते हैं, तो आपके चर) को अपने नेमस्पेस से वर्तमान नामस्थान में कॉपी करें। पर अपने मुख्य नेमस्पेस पर copy
सबराउटिन पर की प्रतिलिपि File::Copy
मॉड्यूल का उपयोग करके कल्पना करें। तुम अब भी इसका इस्तेमाल कर सकते हैं, लेकिन आप यह उस पर नाम स्थान का नाम देने के लिए होगा:
use File::Copy;
...
File::Copy::copy($from_file, $to_file);
निर्यातक (और आयात विधि) के लिए धन्यवाद, किसी भी सबरूटीन्स आप अपने संकुल में डाल दिया @EXPORT
सरणी कॉपी कर रहे हैं वर्तमान नामस्थान पर। इस प्रकार, आप इस तरह s
copy` सबरूटीन फ़ाइल :: कॉपी पहुँच सकते हैं:
use File::Copy;
...
copy ($from_file, $to_file);
यह भी कारण है कि आप our
और नहीं my
के रूप में इन चर के सभी घोषित करना चाहिए। my
चर लिक्सिक रूप से स्कॉप्ड हैं और उन्हें घोषित किए जाने के बाहर एक्सेस नहीं किया जा सकता है। पैकेज चर (जैसे $File::Find::name
) हो सकता है। Exporter
के लिए अपने @EXPORT
, और @EXPORT_OK
सरणी खोजने के लिए, इन्हें पैकेज चर होने की आवश्यकता है।
अब, कार्यों के निर्यात की वांछनीयता ...
सबसे पुराने मॉड्यूल है कि हम जानते हैं और निर्यात सबरूटीन्स प्यार बिना सोचे समझे आता है। आप फ़ाइल :: कॉपी, फ़ाइल :: पथ, फ़ाइल :: ढूँढें, और आपके पास उनके उप-सूटियों तक तुरंत पहुंच है। ऐसा इसलिए है क्योंकि उन्होंने अपने subroutines @EXPORT
सरणी में डाल दिया। यह एक समय में वांछनीय विचार था क्योंकि यह इन कार्यों को तुरंत आपके लिए उपलब्ध कराता है। File::Temp
तरह
नए मॉड्यूल सबरूटीन्स आप आयात करना चाहते घोषित करने के लिए आप की आवश्यकता:
use File::Temp qw(tempdir);
...
my $temp_dir = tempdir;
मैं आपके पास नहीं था कि qw(tempdir)
, मैं tempdir
फ़ंक्शन का उपयोग नहीं कर सका।
इसे विनम्र माना जाता है। मॉड्यूल फ़ंक्शन आयात करने के लिए आपकी अनुमति मांग रहा है। यह subroutines @EXPORT_OK
में डालकर किया जाता है। ये केवल अनुरोध पर निर्यात किया जाएगा।
यह बेहतर है क्योंकि आपको केवल वही चीज़ आयात करने की ज़रूरत नहीं है, जो आपको चाहिए। और, आप दस्तावेज कर रहे हैं जहां इन कार्यों को परिभाषित किया गया है।
ऑब्जेक्ट ओरिएंटेड मॉड्यूल कुछ भी निर्यात नहीं करते हैं और निर्यातक का उपयोग करने की आवश्यकता नहीं है। यह एक लंबा समय रहा है क्योंकि मैंने एक मॉड्यूल लिखा है जो निर्यातक का उपयोग करता है।
- हम के बारे में पैकेज चर यहां बात कर रहे हैं। पैकेज चर हर जगह दिखाई दे रहे हैं।
'perldoc perlobj' और 'perldoc perltoot' देखें। –
निर्यात विधियों को समझने का कोई मतलब नहीं है?! क्या आपका मतलब "subs" है? – ikegami