2010-02-01 7 views
47

Another question मुझे कोड पुन: उपयोग के विभिन्न तरीकों के बारे में सोचने लगा: use बनाम require बनाम doपर्ल में, क्या फ़ाइल की आवश्यकता के मुकाबले मॉड्यूल का उपयोग करना बेहतर है?

मुझे यहां बहुत सारी पोस्ट दिखाई देती हैं जहां सवाल require के उपयोग के आसपास कोड लोड करने और निष्पादित करने के लिए केंद्रित है। ऐसा लगता है कि मुझे एक स्पष्ट बुरी आदत है, लेकिन मुझे इस मुद्दे पर कोई अच्छा संसाधन नहीं मिला है कि मैं लोगों को इंगित कर सकता हूं।

perlfaq8use और require के बीच अंतर को कवर करता है, लेकिन यह प्राथमिकता (5.10 के रूप में - 5.8.8 there is a quick bit of advice in favor of use में) के संबंध में कोई सलाह नहीं देता है।

यह विषय चर्चा की कमी से पीड़ित है। मेरे पास कुछ प्रश्न हैं जिन्हें मैं चर्चा करना चाहता हूं:

  1. पर्ल में कोड पुन: उपयोग की पसंदीदा विधि क्या है?
    • use ModuleName;
    • require ModuleName;
    • require 'file.pl';
    • do 'file.pl';
  2. require ModuleName और require "file.pl" के बीच क्या अंतर है?
  3. क्या require "file.pl" का उपयोग करना कभी अच्छा विचार है? क्यों या क्यों नहीं?
+0

क्या आपका मतलब 'मॉड्यूल की आवश्यकता है' या हो सकता है कि फ़ाइल की आवश्यकता है "फ़ाइल" की बजाय " –

+0

@ माइकल, इसकी आवश्यकता को संसाधित करने के लिए 'फ़ाइल "की आवश्यकता है" वास्तव में' करें 'फ़ाइल' 'का उपयोग करता है, लेकिन यह केवल एक बार दी गई फ़ाइल पर ही काम करेगा। – daotoad

+0

@daotoad: यही वह नहीं है जो मैं पूछ रहा था। * .pl फ़ाइलों के लिए आमतौर पर 'do' का उपयोग किया जाता है जबकि * .pm फ़ाइलों के लिए 'आवश्यकता' का उपयोग किया जाता है। फाइल एक्सटेंशन निश्चित रूप से कोई फर्क नहीं पड़ता, लेकिन सम्मेलन * .pl का मतलब लंबे समय तक "पर्ल लाइब्रेरी" नहीं है। मैं स्पष्ट करने की कोशिश कर रहा था कि क्या आप पुराने उपयोग का जिक्र कर रहे थे या यदि बाहरी कोड ('उपयोग', 'आवश्यकता', और' do') लोड करने के तीन तरीकों को प्रतिबिंबित करने के लिए प्रश्न संशोधित किया जाना चाहिए। चर्चा में सभी तीन रूपों को शामिल करने के लिए यह अधिक समझ (मेरे लिए) होगा। –

उत्तर

63

मानक अभ्यास use अधिकतर समय, require कभी-कभी, और do का उपयोग करना है।

do 'file' एक पर्ल स्क्रिप्ट के रूप में file निष्पादित करेगा। यह फ़ाइल की सामग्री पर eval पर कॉल करने जैसा है; यदि आप do एक ही फ़ाइल को कई बार (उदा। एक लूप में) इसे हर बार पार्स और मूल्यांकन किया जाएगा जो आप चाहते हैं कि होने की संभावना नहीं है। do और eval के बीच का अंतर यह है कि do संलग्न क्षेत्र में व्याख्यात्मक चर नहीं देख सकता है, जो इसे सुरक्षित बनाता है। do सामान्य कार्यों के लिए कभी-कभी उपयोगी होता है जैसे पर्ल कोड के रूप में लिखी गई कॉन्फ़िगरेशन फ़ाइल को संसाधित करना।

require 'file'do 'file' जैसा है सिवाय इसके कि यह केवल एक विशेष फ़ाइल को एक बार पार्स करेगा और कुछ गलत होने पर अपवाद उठाएगा। (उदाहरण के लिए फ़ाइल नहीं मिल सकती है, इसमें एक वाक्यविन्यास त्रुटि है, आदि) स्वचालित त्रुटि जांच do 'file' के लिए यह एक अच्छा प्रतिस्थापन बनाती है लेकिन यह अभी भी एक ही सरल उपयोग के लिए उपयुक्त है।

do 'file' और require 'file' रूपों को पिछले कुछ दिनों से कैरियोवर हैं जब * .pl फ़ाइल एक्सटेंशन का अर्थ "पर्ल लाइब्रेरी" था। पर्ल में कोड का पुन: उपयोग करने का आधुनिक तरीका इसे मॉड्यूल में व्यवस्थित करना है। "लाइब्रेरी" के बजाय कुछ "मॉड्यूल" को कॉल करना केवल अर्थशास्त्र है, लेकिन शब्दों का मतलब पर्ल संस्कृति में अलग-अलग चीजें हैं। एक पुस्तकालय सिर्फ subroutines का संग्रह है; एक मॉड्यूल एक नामस्थान प्रदान करता है, जिससे इसे पुन: उपयोग के लिए कहीं अधिक उपयुक्त बना दिया जाता है।

use Module मॉड्यूल से कोड का उपयोग करने का सामान्य तरीका है। ध्यान दें कि Module पैकेज नाम को एक शब्द के रूप में है और एक उद्धृत स्ट्रिंग नहीं है जिसमें फ़ाइल नाम है। पर्ल एक पैकेज नाम से आपके लिए एक फ़ाइल नाम में अनुवाद संभालती है। use कथन संकलन समय पर होते हैं और विफल होने पर अपवाद फेंक देते हैं। इसका अर्थ यह है कि यदि आपका कोड उस मॉड्यूल पर निर्भर करता है जो उपलब्ध नहीं है या त्रुटि लोड करने में विफल रहता है तो तुरंत दिखाई देगा। इसके अतिरिक्त, use स्वचालित रूप से मॉड्यूल के import() विधि को कॉल करता है यदि उसके पास ऐसा कोई है जो आपको थोड़ा टाइपिंग सहेज सकता है।

require Moduleuse Module जैसा है कि यह रनटाइम पर होता है और स्वचालित रूप से मॉड्यूल की import() विधि को कॉल नहीं करता है। आम तौर पर आप use का उपयोग जल्दी और अनुमानित रूप से विफल होने के लिए करना चाहते हैं, लेकिन कभी-कभी require बेहतर होता है। उदाहरण के लिए, require का उपयोग बड़े मॉड्यूल की लोडिंग में देरी के लिए किया जा सकता है, जिसे कभी-कभी कभी-कभी आवश्यक या मॉड्यूल वैकल्पिक बनाने के लिए किया जाता है। (यानी मॉड्यूल का उपयोग करें यदि यह उपलब्ध है लेकिन कुछ और पर वापस आना या कार्यक्षमता को कम करना है।)

कड़ाई से बोलते हुए, require Module और require 'file' के बीच एकमात्र अंतर यह है कि पहला फॉर्म पैकेज से स्वचालित अनुवाद को ट्रिगर करता है Foo::Bar जैसे फ़ाइल नाम जैसे Foo/Bar.pm पर नाम है जबकि बाद वाला फॉर्म फ़ाइल नाम से शुरू होने की अपेक्षा करता है। सम्मेलन के अनुसार, पहले फॉर्म का उपयोग मॉड्यूल लोड करने के लिए किया जाता है जबकि दूसरा फॉर्म लाइब्रेरी लोड करने के लिए उपयोग किया जाता है।

5

वहाँ use का उपयोग कर के लिए एक प्रमुख प्राथमिकता है, क्योंकि यह संकलन के दौरान पहले के एक राज्य BEGIN {} में होता है, और त्रुटियों के लिए एक अधिक उपयुक्त समय पर उपयोगकर्ता के लिए प्रचारित किया जा करते हैं है। यह sub import {} फ़ंक्शन भी कॉल करता है जो आयात प्रक्रिया पर कॉलर नियंत्रण देता है। यह ऐसा कुछ है जिसका भारी उपयोग होता है। विशिष्ट नामस्थान import पर कॉल करके आप वही प्रभाव प्राप्त कर सकते हैं, लेकिन इसके लिए आपको नामस्थान और फ़ाइल का नाम जानना होगा, और कॉल को सबराउटिन पर कोड करना होगा ... जो बहुत अधिक काम है। इसके विपरीत, use, आपको केवल नामस्थान जानने की आवश्यकता है, और फिर इसे मिलान करने वाले नामस्थान के साथ फ़ाइल की आवश्यकता होती है - इस प्रकार उपयोगकर्ता के लिए जागरूक नामों और फ़ाइलों के बीच का लिंक बनाते हैं। अधिक जानकारी के लिए

perldoc -f use, और perldoc -f require पढ़ें। प्रति perldoc -f use:
useBEGIN { require Module; Module->import(LIST); } जैसा ही है जो कि बहुत अधिक बदसूरत है।

4

मुख्य अंतर आयात/निर्यात के आसपास है। use पसंद किया जाता है आप एक मॉड्यूल का इस्तेमाल कर रही रहे हैं जब क्योंकि यह आपको जो दिनचर्या है कि आप अपने नाम स्थान में आयात करना चाहते हैं निर्दिष्ट कर सकते हैं:

use MyModule qw(foo bar baz); # allows foo(), bar() and baz() to be used 

use MyModule qw(); # Requires explicit naming (e.g. MyModule::foo). 

use भी देता है मॉड्यूल के import() प्रक्रिया जो अक्सर सेट करने के लिए प्रयोग किया जाता है चलाता है मॉड्यूल अप

अधिक जानकारी के लिए use के लिए perldoc देखें।

+0

वास्तव में, वे एक ही हैं। आपके उदाहरण में 'MyModule :: import() '' qw (foo bar baz) स्वीकार कर रहा है और निर्यात स्वयं ही कर रहा है। यह वही सुविधा है, 'निर्यातक', और 'उप :: निर्यातक' सिर्फ 'आयात() 'उत्पन्न करता है। –

2

मॉड्यूल में use का उपयोग करने में मॉड्यूल में संकलन समय के दौरान मॉड्यूल शामिल होगा जो गति को बढ़ाता है लेकिन अधिक स्मृति का उपयोग करता है, जबकि require मॉड्यूल का उपयोग रन टाइम के दौरान शामिल होगा। आवश्यकता होने पर आयात का उपयोग किए बिना मॉड्यूल की आवश्यकता कम स्मृति का उपयोग करती है लेकिन गति को कम करती है।

संबंधित मुद्दे

 संबंधित मुद्दे