2015-03-04 13 views
5

मुझे कुछ पर्ल कोड विरासत में मिला है जो निश्चित रूप से सख्त या चेतावनियों का उपयोग नहीं करता है, और मैं अनियमित चर और इसी तरह का उपयोग करता रहता हूं।ब्रैकेट कोड अनुभाग का उपयोग सख्त/कोई सख्त नहीं है?

मैं कोड के वर्गों है कि मैं इस तरह संशोधित कर रहा हूँ ब्रैकेट करना चाहते हैं:

use warnings; 
use strict; 

... my code changes and additions ... 

no strict; 
no warnings; 

और वह काम करने के लिए लगता है, लेकिन मैं गूढ़ रहस्य क्या the perldoc on use का मतलब है जब यह कहते हैं ये हैं होने मुद्दों कर रहा हूँ कंपाइलर निर्देश जो वर्तमान "ब्लॉक स्कोप" में आयात करते हैं। क्या इसका मतलब यह है कि किसी भी स्कोप में use strictno strict के साथ unpaired हो सकता है? no strict वैश्विक दायरे की पूंछ पर use strict के अर्थ को पहले से ही उसी दायरे में पूर्ववत कर रहा है?

+1

मैं पुष्टि करूंगा कि यह अस्थायी रूप से * मौजूदा कोड के साथ काम करना एक अच्छा विचार है। इससे भी बेहतर होगा कि आपके अतिरिक्त कार्यों को एक अलग लाइब्रेरी फ़ाइल में फंक्शंस में डालें। आप अंततः इसे सख्त के तहत लाएंगे। – Schwern

+0

कोई भी जो 'सख्त' का उपयोग नहीं करता है, वह भी आसान कोड encapsulation की अनुमति नहीं देता है ... मुझे अपने ग्यारहवें वैश्विक हैशटेबल्स में जोड़ना है, आप देखते हैं ... – stevesliva

+3

हाँ, यह निराशाजनक है, लेकिन यह रोका नहीं है आप पुस्तकालय subroutines का उपयोग करने से। आप उनके ग्लोबल्स को '% main :: blah' के साथ संदर्भित कर सकते हैं (माना जाता है कि यह पैकेज मुख्य में है)। इससे भी बेहतर, संदर्भ के अनुसार अपने subroutines में संशोधित करने के लिए अपने ग्लोबल को पारित करने की आवश्यकता है: 'some_new_sub (\% blah) '। यह अपने वैश्विक गड़बड़ी को नए कोड को संक्रमित करने से रोक देगा। यह पहली बार गन्दा होगा, लेकिन यह आपको एक बेहतर विचार देगा कि किस कोड को डेटा चाहिए। इन सबके माध्यम से, एक्स्ट्रेक्ट विधि पैटर्न आपका सबसे मजबूत टूल होगा। – Schwern

उत्तर

10

"ब्लॉक गुंजाइश" का अर्थ है दोनों use strict; और no strict; जहां वे अंतरतम संलग्न ब्लॉक के अंत में कर रहे हैं से प्रभाव है, इसलिए कोई एक बाद no strict एक पहले use strict पूर्ववत नहीं करता है। यह कोड में उस बिंदु से सबसे निचले दायरे के लिए इसे बदलता है। तो:

{ 
    use strict; 
    # strict in effect 
    { 
     # strict still in effect 
     no strict; 
     # strict not in effect 
    } 
    # strict in effect 
    no strict; 
    # strict not in effect 
    use strict; 
    # strict in effect 
} 
+0

अच्छा चित्रण, धन्यवाद। मुझे दो चिंताएं थीं: 1.) इस के लिए 'सख्त' का उपयोग करने वाले लोगों के कुछ उदाहरण हैं, ताकि अखंड कोड में परिवर्तन को ब्रैकेट किया जा सके। 2.) मैं चिंतित था कि वहां एक प्रकार की 2-पास व्याख्या है जो चीजों को सचित्र की तरह काम नहीं कर सकती है, इसलिए पुष्टि अच्छी है। – stevesliva

+2

"ब्लॉक स्कोप" को "लेक्सिकल स्कोप" भी कहा जाता है। यह ध्यान रखना महत्वपूर्ण है कि शब्दावली का दायरा * subroutine कॉल दर्ज नहीं करता है। "लेक्सिकल" जैसा कि "आप पृष्ठ पर क्या पढ़ते हैं"। जब आप प्रतीकात्मक संदर्भों का उपयोग करना चाहते हैं तो दुर्लभ मौकों पर छोटे ब्लॉक में 'कोई सख्त' अक्सर उपयोग नहीं किया जाता है। एक आम उपयोग फ्लाई पर subroutines बना रहा है। '{कोई सख्त 'रेफरी' नहीं; * {$ sub_name} = उप {...}} '। – Schwern

+1

"डायनामिक स्कोप" के विपरीत जो सबराउटिन कॉल दर्ज करता है – ysth

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