2009-12-03 20 views
7

यहाँ मैं प्राप्त करना चाहते हैं क्या करना है:मैं एक सबराउटिन को फिर से परिभाषित कैसे कर सकता हूं और बूढ़ा भी रख सकता हूं?

sub first { 
    print "this is original first"; 
} 

*original_first = \&first; 

sub first { 
    print "this is first redefined"; 
} 

original_first(); # i expect this to print "this is original first" 
first() # i expect this to print "this is first redefined" 

मैंने सोचा था कि first के लिए प्रतीक को सहेजकर, मैं बाद में मूल सबरूटीन कॉल करने के लिए (नाम original_first से कम) में सक्षम है और यह भी सक्षम होने के लिए होगा first पर कॉल करने के लिए, और एक को फिर से परिभाषित करें। हालांकि, अगर मैं original_first पर कॉल करता हूं, तो मुझे अभी भी "यह पहली बार परिभाषित किया गया है"। मुझे यह काम करने के लिए क्या करना है?

उत्तर

9

आपकी अपेक्षा के अनुरूप यह काम करना चाहिए:

sub first { 
    print "this is original first"; 
} 

*original_first = \&first; 

*first = sub { 
    print "this is first redefined"; 
}; 
+0

क्या यह संभव है, जब आप 'पहले' प्रतीक को फिर से परिभाषित करते हैं, केवल कोड भाग को प्रभावित करने के लिए? – Geo

+5

एक टाइपग्लोब में एक कोडफ (एक उप {...} द्वारा उत्पन्न) का असाइनमेंट केवल ग्लोब में कोड प्रविष्टि को प्रतिस्थापित करेगा। ग्लोब में कोई अन्य डेटाटाइप –

+4

नहीं बदलेगा आप केवल विशिष्ट ब्लॉक के भीतर फ़ंक्शन को प्रतिस्थापित करने के लिए 'स्थानीय * पहले = उप {...};' का उपयोग भी कर सकते हैं। –

9
अपने कोड में

, पर्ल दोनों उप इस के समान घोषणाओं की व्याख्या:

BEGIN { 
    *first = sub { ... } 
} 

इसलिए दोनों कार्य &first अंत तक प्रति सहेजने से पहले हो रहा करने के लिए और दिनचर्या बुलाओ। ठीक एक क्रम काम में दूसरी घोषणा बनाना है:

sub first { 
    print "this is original first"; 
} 

*original_first = \&first; 

*first = sub {print "this is first redefined"}; 

original_first(); # prints "this is original first" 
first();   # prints "this is first redefined" 
+0

अच्छा स्पष्टीकरण। धन्यवाद! – Geo

+0

आपके द्वारा वर्णित 'उप {}' -> 'BEGIN {* ...} 'व्यवहार के लिए उद्धरण आवश्यक है। – Ether

+0

मैं उपरोक्त को perlmod से निम्नलिखित स्पष्टीकरण से जोड़ रहा हूं: सुब्रौटाइन परिभाषाएं (और उस मामले के लिए घोषणाएं) आवश्यक रूप से पैकेज में स्थित नहीं हैं जिनके प्रतीक तालिका पर वे कब्जा करते हैं। आप subroutine के नाम को स्पष्ट रूप से अर्हता प्राप्त करके अपने पैकेज के बाहर एक सबराउटिन परिभाषित कर सकते हैं: 1. पैकेज मुख्य; 2. उप Some_package :: foo {...} # और foo Some_package में परिभाषित किया गया यह सिर्फ संकलन समय पर typeglob कार्य के लिए एक आशुलिपि है: 1. शुरू {* Some_package :: foo = उप {... }} –

1

Hook::LexWrap मॉड्यूल है, जो आप के लिए यह सब संभाल कर सकते हैं देखें। यदि आप मॉड्यूल का उपयोग नहीं करना चाहते हैं, तो बस स्रोत देखें, जो आपको दिखाता है कि यह वास्तव में कैसे करें।

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

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