2012-01-18 6 views
17

संभव डुप्लिकेट:
When should I use the & to call a Perl subroutine?अंतर

पर्ल स्क्रिप्ट में, क्यों समारोह लागू अलग ढंग से कुछ समय लिखा है की कि विधि है। मैं & फ़ंक्शन देखता हूं और कभी-कभी फ़ंक्शन()। क्या वे दोनों एक जैसे हैं और यह सिर्फ एक शैली है जिसे कोई फटकारना चाहेगा? यदि वे वही हैं, तो वे दोनों क्यों उपलब्ध हैं, क्या कोई भी पर्याप्त नहीं होगा? मुझे लगता है कि दोनों तरीकों के बीच कुछ अर्थपूर्ण अंतर है जो उन्हें एक दूसरे से अलग करता है ... लेकिन किस तरह की परिस्थितियों में?

--- चूंकि मैं टाइमआउट कारणों के लिए अपने स्वयं के प्रश्न का उत्तर नहीं दे सकता - मैं स्वयं प्रश्न के खंड में उत्तर अपडेट कर रहा हूं। जब मुझे उत्तर ब्लॉक को अपडेट करने का मौका मिलता है, तो मैं इसे वहां रखूंगा।

मुझे 'लर्निंग पर्ल' पुस्तक में प्रासंगिक पाठ मिला .. हालांकि टिप के लिए धन्यवाद। अध्याय 4: सबराउटिन - एम्परस को छोड़कर।

मुझे एम्पर्सेंड & परल फ़ंक्शन के लिए उपयोग में अधिक रुचि थी। यदि किसी सबराउटिन को पहले से बुलाए जाने से पहले परिभाषित किया गया है, तो & का उपयोग किए बिना सबराउटिन को बुलाया जा सकता है जबकि फ़ंक्शन को बिल्टिन फ़ंक्शंस का आह्वान करने के समान ही कहा जाता है। & का उपयोग बिल्टिन फ़ंक्शंस और उपयोगकर्ता परिभाषित फ़ंक्शंस के बीच अंतर करने के लिए भी किया जाता है यदि फ़ंक्शन को लागू किया जाना चाहिए, तो बिल्टिन फ़ंक्शन में से एक का नाम उसी नाम का उपयोग करता है, बशर्ते इसे लागू होने से पहले परिभाषित किया गया हो।

() का उपयोग केवल subroutines के तर्कों को पारित करने के लिए उचित है, जबकि यदि उपयोग नहीं किया जाता है, तो वर्तमान तर्कों की डिफ़ॉल्ट सूची फॉर्म @_ में पारित की जाती है। यदि तर्क subroutine के लिए() में निर्दिष्ट हैं, तो यह एक subroutine माना जाता है और अगर पहले पार्सिंग के दौरान परिभाषित नहीं किया गया है तो भी लागू किया जाता है।

+11

देखें [फ़ंक्शन को कॉल करने के बीच क्या अंतर है और foo और foo()?] (Http://perldoc.perl.org/perlfaq7.html#What%27s-the-difference-between-calling-a- कार्यक्षमता -स-% 26foo-and-foo% 28% 2 9% 3 एफ) पर्ल एफएक्यू में 7. – manatwork

+0

hi @manatwork, जो foo और foo() के बीच अंतर बताता है, लेकिन यदि आवश्यक नहीं है तो एम्पर्सेंड का उपयोग क्यों किया जा रहा है ... कब क्या ये ज़रूरी हैं? –

+0

विवरण अनुभाग में [perlsub] (http://perldoc.perl.org/perlsub.html) ''' 'वैकल्पिक होने पर गणना करता है। – manatwork

उत्तर

4

@manatwork ने उल्लेख किया और @KeithThompson आप इन लेखों में जानकारी प्राप्त कर सकते हैं:

  1. एक सामान्य विवरण - perlsub: Perl Subroutines: Description - What's the difference between calling a function as &foo and foo()?
  2. एक समारोह कॉल के लिए & या नहीं का उपयोग कर के बारे में सूक्ष्म जानकारी।
+0

यदि आप मेरे एक-चार के बारे में सोच रहे हैं। संपादित करें: आपके उत्तर _rendered_ को गलत तरीके से यूआरएल-एन्कोडेड यूआरएल के साथ (भले ही यह मार्कडाउन स्रोत में सही था), जिसके कारण "क्या अंतर है ..." का एंकर हिस्सा सही तरीके से काम नहीं करता है (एक शीर्ष पर लेट गया ब्याज के लंगर के बजाय लंबा लक्ष्य पृष्ठ)। मुझे संदेह है कि यह एक _historical_ Markdown-rendering बग था जिसे बाद में _new_ उत्तरों के लिए तय किया गया है। अपने उत्तर को फिर से सहेजने के लिए मजबूर कर, समस्या दूर चली गई। – mklement0

18

यह बहुत ही विशेष का उपयोग करता है:

  • & पर्ल बताता उप के प्रोटोटाइप की अनदेखी करने के।
  • & आपको कॉलर के @_ का उपयोग करने की अनुमति दे सकता है। (&foo; बिना माता-पिता या तर्क के)।
  • goto &foo; और defined &foo
  • एक संदर्भ प्राप्त करना (उदा। \&foo)।

कुछ लोगों (ज्यादातर शुरुआती) इसका इस्तेमाल, builtin कार्यों से उपयोगकर्ता बाद के चरणों को अलग करने के बाद से builtin कार्यों & से पहले नहीं किया जा सकता।

+0

बिल्टिन से उपयोगकर्ता सबस को अलग करने के लिए अन्य तरीका क्या है? – jackthehipster

+2

@ जेकथिपस्टर, नामकरण सम्मेलन, हालांकि मैं इसकी आवश्यकता पर सवाल उठाता हूं। कौन परवाह करता है इसे किसने लिखा था। क्या इससे कोई फर्क नहीं पड़ता कि 'utf8 :: encode' एक बिल्टिन है और' एनकोड :: encode_utf8' नहीं है? – ikegami