2016-09-20 11 views
6

कृपया निम्नलिखित कोड पर एक नज़र डालें:पर्ल `परिभाषित 'और` undef' सबरूटीन गुंजाइश

use strict; 
use warnings; 


print "subroutine is defined\n" if defined &myf; 
myf(); 

sub myf 
{ 
     print "called myf\n"; 
} 

undef &myf; 
#myf(); 
print "now subroutine is defined\n" if defined &myf; 

उत्पादन

subroutine is defined 
called myf 

है पहले print बयान मुद्रित कर सकते हैं, इसका मतलब यह है दुभाषिया (या कंपाइलर?) आगे दिखता है और subroutine परिभाषा को देखता है? यदि ऐसा है, तो यह undef &myf; को दूसरे print कथन के रूप में क्यों नहीं देखता है?

धन्यवाद

+4

क्योंकि 'undef' रनटाइम पर चलाने के लिए कोड है, लेकिन 'sub' एक परिभाषा है और संकलन समय पर होती है। – Sobrique

उत्तर

10

कि गुंजाइश के साथ क्या करना है नहीं है, लेकिन के साथ समय और रन टाइम संकलन। यहां एक सरल स्पष्टीकरण दिया गया है।

पर्ल दुभाषिया प्रारंभ में आपके कोड को स्कैन करेगा, और use कथन या BEGIN ब्लॉक का पालन करेगा। उस समय, यह सभी sub एस देखता है, और उन्हें अपने संबंधित पैकेज में नीचे नोट करता है। तो अब आपके पास अपनी प्रतीक तालिका में &::myf है।

जब संकलन समय प्रोग्राम के अंत तक पहुंच गया है, तो यह रन टाइम में स्विच हो जाएगा।

उस बिंदु पर, यह वास्तव में कोड चलाता है। &myf परिभाषित होने पर आपका पहला print कथन निष्पादित किया गया है। हम जानते हैं कि यह है, क्योंकि यह संकलन समय पर सेट हो गया है। पर्ल फिर उस समारोह को बुलाता है। सब ठीक हैं। अब आप undef प्रतीक तालिका में प्रवेश करते हैं। यह रन टाइम पर भी होता है।

उसके बाद, defined &myf झूठा लौटाता है, इसलिए यह प्रिंट नहीं करता है।

आपके पास कोड में myf() पर दूसरी कॉल भी है, लेकिन टिप्पणी की गई। यदि आप टिप्पणी हटाते हैं, तो यह शिकायत करेगा, अनिर्धारित सबराउटिन & मुख्य :: myf कहा जाता है। यह हुआ कि यह क्या हुआ एक अच्छा संकेत है।

तो वास्तव में यह कोड में आगे या पीछे नहीं दिखता है। यह उस समय कोड स्कैनिंग समाप्त हो चुका है।


विभिन्न चरणों को in perlmod समझाया गया है।

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

+0

ग्रेट उत्तर, लेकिन यह स्पष्ट नहीं करता है कि सबराउटिन परिभाषित होने से पहले मैं क्यों 'myf; '(या यहां तक ​​कि' मुख्य :: myf;') एक कथन नहीं लिख सकता। – Borodin

+1

@ बोरोडिन: क्योंकि संकलन समय पर कंपिलर नहीं जानता है कि 'myf' या' main :: myf' barewords subroutine हैं ('सख्त उपयोग' बंद करें और आपको मिलता है: "सवार सब" के दौरान "Bareword" myf "की अनुमति नहीं है" उपयोग में। subroutine परिभाषित करने के बाद आपके पास अपनी प्रतीक तालिका में '& :: myf' है और आप परिभाषा के बाद' myf' या 'main :: myf' लिख सकते हैं। यह सुनिश्चित करने के लिए कि आप subroutine को कॉल करना चाहते हैं बेवकूफ के बाद कोष्ठक: 'myf()' –

+0

वह @ Borodin प्रश्न का हिस्सा नहीं था;) – simbabque

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