2012-07-04 14 views
6

मैं तथ्य यह है कि [email protected] एक वैश्विक चर रहा है के बारे में पता कर रहा हूँ, फिर भी मैं समझ नहीं क्यों मैं eval उपयोग करने से पहले यह स्थानीय बनाना चाहिए:

उदाहरण के लिए:

eval { SOME_FUNC_THAT_MAY_DIE(); }; 
if ([email protected]) { 
    print "An error occured!\n"; 
} 

ही संभव जिस चीज के बारे में मैं सोच सकता हूं, अगर कुछ सिग्नल हैंडलर die पर कॉल करेंगे, उसी समय मैं [email protected] पढ़ने की कोशिश करता हूं, मैं यहां क्या खो रहा हूं?

उत्तर

12

eval कॉल करने से पहले local [email protected] कहने के लिए कारण आपके फोन करने वाले का [email protected] पर कदम रख से बचना है। किसी भी ग्लोबल वेरिएबल को बदलने के लिए एक सबराउटिन के लिए यह अशिष्ट है (जब तक यह सबराउटिन के निर्दिष्ट उद्देश्यों में से एक नहीं है)। यह वास्तव में शीर्ष-स्तरीय कोड (किसी भी सबराउटिन के अंदर नहीं) के साथ एक मुद्दा नहीं है।

इसके अलावा, पुराने पर्ल के पर, किसी भी eval वस्तु विनाश के दौरान कहा जाता पीटना होगा वैश्विक [email protected] जब तक [email protected] पहले स्थानीय था (क्योंकि एक अपवाद एक eval ब्लॉक से फेंका जा रहा था वस्तु को नष्ट कर दिया जा रहा था तो)। यह fixed in 5.14.0 था, लेकिन कई लोग अभी भी पुराने पर्ल्स चला रहे हैं।

9

Try::Tiny मॉड्यूल प्रलेखन तर्क (और साथ ही उपलब्ध कराने के लिए एक विकल्प) देता है:

आप एक eval ब्लॉक चलाने के लिए और यह सफल होता है, $ @ साफ कर दिया जाएगा, संभवतः एक त्रुटि वर्तमान में किया जा रहा है कि clobbering जब पकड़े गए। यह एक दूरी पर कार्रवाई का कारण बनता है, पिछली त्रुटियों को साफ़ करने से आपका कॉलर अभी तक संभाला नहीं जा सकता है। इस समस्या से बचने के लिए $ @ को ठीक से स्थानीयकृत किया जाना चाहिए ताकि इस मुद्दे से बचें। अधिक विशेष रूप से, $ @ को eval की शुरुआत में गिरफ्तार किया जाता है, जो आपके मरने से पहले पिछली त्रुटि को कैप्चर करना असंभव बनाता है (उदाहरण के लिए त्रुटि स्टैक के साथ अपवाद ऑब्जेक्ट्स बनाते समय)।
+0

कारण मुझे यह कारण मिला, बिल्कुल इसलिए क्योंकि मुझे ट्राई :: टिनी के दस्तावेज़ में इस अनुच्छेद को बिल्कुल समझ में नहीं आया था। 'वर्तमान में पकड़े जा रहे किसी त्रुटि को संभावित रूप से क्लोब करने' का क्या अर्थ है? ;-) –

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

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