सीखने के प्रयोजनों के लिए, मैं पर्ल में घटना-संचालित कार्यक्रमों के निर्माण के विचार के साथ चारों ओर घूम रहा हूं और ध्यान दिया कि यह अच्छा हो सकता है कि एक ईवेंट हैंडलर के रूप में पंजीकृत सबराउटिन विफल हो सकता है, बस एक और कॉल शेड्यूल करें बाद में खुद के लिए। अब तक, मैं कुछ इस तरह के साथ आने के लिए है:पर्ल में, एक सबराउटिन को कोडफ्रफ़ कैसे प्राप्त हो सकता है जो स्वयं को इंगित करता है?
my $cb;
my $try = 3;
$cb = sub {
my $rc = do_stuff();
if (!$rc && --$try) {
schedule_event($cb, 10); # schedule $cb to be called in 10 seconds
} else {
do_other_stuff;
}
};
schedule_event($cb, 0); # schedule initial call to $cb to be performed ASAP
वहाँ एक रास्ता उप अंदर है कि कोड है कि उप करने के लिए coderef उपयोग कर सकते हैं तो मैं एक अतिरिक्त चर का उपयोग किए बिना कर सकता है? मैं इस तरह की प्रारंभिक कॉल शेड्यूल करना चाहता हूं।
schedule_event(sub { ... }, 0);
मैं caller(0)[3]
का उपयोग करने का पहली बार सोचा, लेकिन यह केवल मुझे एक समारोह नाम, (अगर कोई नाम है), नहीं एक कोड संदर्भ एक पैड इसे से जुड़ी है कि देता है।
वास्तव में अच्छा सवाल है। –
यदि आप प्रोग्राम के उसी भाग में बहुत कुछ कर रहे हैं, तो परिपत्र संदर्भ के कारण आपके पास मेमोरी रिसाव होगा। आप इससे बचने के लिए स्केलर :: उपयोग :: कमजोर() का उपयोग कर सकते हैं, या नीचे सुझाए गए अनुसार उप :: वर्तमान या वाई-संयोजक का उपयोग कर सकते हैं। चर्चा के लिए http://use.perl.org/~Aristotle/journal/30896 देखें। यदि यह कोड लगातार वातावरण में नहीं है, तो ऊपर दिया गया आपका कोड ठीक है। – runrig
रन्रिग: लिंक के लिए धन्यवाद। अब मेरा सिर चकरा रहा है। :-) शायद मैं वास्तव में कुछ सीखने जा रहा हूं ... – hillu