पर्ल में डिफ़ॉल्ट स्कोपिंग व्यवहार ऐसा क्यों है?

Dec 10 2020

मैं स्कूल के लिए पर्ल सीख रहा हूं, और वर्तमान में myकीवर्ड के उपयोग के बारे में और पर्ल में स्कूपिंग के बारे में सीख रहा हूं । (संदर्भ के लिए, मैं देख रहा था कि मुझे पर्ल में "मेरे" कीवर्ड का उपयोग कैसे करना चाहिए? ) उम्मीद है कि यह सवाल पहले से कहीं और नहीं पूछा गया है, लेकिन यदि नहीं ... तो पर्ल का डिफ़ॉल्ट व्यवहार उस तरह से क्यों है?

यह मुझे लगता है कि सी-स्टाइल डिफ़ॉल्ट स्कोपिंग सबसे अधिक समझ में आता है ... आप एक ब्लॉक के अंदर एक चर घोषित करते हैं, चर उस ब्लॉक के अंदर मौजूद होता है, और एक बार जब आप उस ब्लॉक को छोड़ देते हैं, तो वह चर अब सुलभ नहीं है। ऐसा क्यों है कि इस व्यवहार को निर्दिष्ट करने के लिए, आपको myकीवर्ड का उपयोग करना चाहिए ? ऐसा लगता है कि एक चर के दायरे को केवल वहीं तक सीमित किया जाता है जहाँ इसका उपयोग किया जाता है, यह अच्छा मानक व्यवहार होगा, और myहर समय उपयोग करना बहुत ही बेमानी लगता है और जैसे यह कोड के अव्यवस्था में योगदान देगा।

ऐसा लगता है कि किराने की दुकान पर चलना और तुरंत जोर से अपने खरीदारी के साथ जारी रखने से पहले अपने पसंदीदा ब्रांड की घोषणा करना, बस अगर आपके आसपास कोई उत्सुक था (जो वे शायद नहीं थे)।

(संभावित डुप्लिकेट, यह प्रश्न नीचे हो सकता है ... फ़ाइल स्कोप पर "मेरे" के साथ पर्ल चर की घोषणा क्यों करें? )

जवाब

9 ikegami Dec 10 2020 at 06:30

यदि आप lexically-scoped वैरिएबल चाहते हैं, तो आपको कुछ प्रकार की घोषणा की आवश्यकता है। [१]


यह मुझे लगता है कि सी-स्टाइल डिफ़ॉल्ट स्कोपिंग सबसे अधिक समझ में आता है ... आप एक ब्लॉक के अंदर एक चर घोषित करते हैं, चर उस ब्लॉक के अंदर मौजूद होता है, और एक बार जब आप उस ब्लॉक को छोड़ देते हैं, तो वह चर अब उपलब्ध नहीं है

ऐसा इसलिए है कि वास्तव में यह कैसे पर्ल में काम करता है। जहां कोई int iC में किसी चर का उपयोग करने की घोषणा करेगा, वहीं कोई my $iपर्ल में उपयोग करेगा । दोनों एक शाब्दिक रूप से स्कोपेड वैरिएबल बनाते हैं, जिसे एक वैरिएबल कहना है जो केवल वर्तमान ब्लॉक और निहित ब्लॉक में दिखाई देता है। ब्लॉक के बाहर कोड निष्पादित करते समय, चर सुलभ नहीं होता है। Perl में चर का दायरा C. [2] में चर के दायरे के समान है।

// Can't use `i` here.           # Can't use `$i` here.
{                                {
   // Can't use `i` here.           # Can't use `$i` here. int i = 4; my $i = 4;
   printf("%d\n", i);       4       say $i; { { printf("%d\n", i); 4 say $i;
      int i = 5;                       my $i = 5; printf("%d\n", i); 5 say $i;
   }                                }
   printf("%d\n", i);       4       say $i; } } // Can't use `i` here. # Can't use `$i` here.

  1. पाइथन में स्पष्ट रूप से परिवर्तनशील घोषणाएँ नहीं हैं, लेकिन इसमें लेक्सिक रूप से स्कोप किए गए चर भी नहीं हैं; पायथन वेरिएबल्स फंक्शन-स्कॉप्ड हैं।

  2. हालाँकि, चर का जीवनकाल समान नहीं है। एक स्केलर को ब्लॉक के अंत में जीवित रखा जा सकता है जिसमें वह पर्ल में रहता है, लेकिन सी में समान चर के लिए मामला नहीं है ("स्वचालित भंडारण अवधि के साथ चर")।

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

    # You can't use `@a` outside of the sub,
    # But you can use the created array anonymously.
    sub f { my @a = qw( abc def ); return \@a; }
    

    इस अर्थ में, my $xएक गतिशील रूप से आवंटित संरचना के लिए अधिक समान है।

6 Schwern Dec 10 2020 at 07:00

क्योंकि 1987 में लैरी वॉल ने ऐसा ही किया था और पर्ल 5 उस निर्णय के अनुकूल है। 1994 में पर्ल 5 तक लेक्ज़िकल वेरिएबल्स को पेश नहीं किया गया था और तब तक पर्ल 4 प्रोग्राम्स की काफी बड़ी संख्या थी।

मैं अटकलें क्यों लगाऊंगा। पर्ल को एक आवेदन भाषा के रूप में कल्पना नहीं की गई थी, यह एक बन गया। पर्ल 1 को 1987 में sed , awk और Bourne शेल के अधिक शक्तिशाली विकल्प के रूप में लिखा गया था ।

यदि आपको कोई समस्या है जो आमतौर पर sed या awk या sh का उपयोग करती है, लेकिन यह उनकी क्षमताओं से अधिक है या उन्हें थोड़ा तेज चलना चाहिए, और आप C में मूर्खतापूर्ण बात नहीं लिखना चाहते हैं, तो पर्ल आपके लिए हो सकता है।

पर्ल 1.0 मैनुअल से ।

sed और awk प्रोग्राम आमतौर पर सिर्फ एक लाइन होते हैं। और शेल चरों में वैश्विक हैं। पर्ल 1 के उद्देश्य को देखते हुए, यह ठीक था।

पिछले कुछ दशकों में स्वीकृत सॉफ्टवेयर इंजीनियरिंग मानकों में बहुत बदलाव आया है। जब सिस्टम छोटे और सरल थे, तो वैश्विक चर अधिक स्वीकार्य थे। जैसे-जैसे जटिलता बढ़ी है, वैश्विक वैरिएबल तेजी से खतरा बन रहे हैं।

1 lordadmira Dec 12 2020 at 11:15

सख्ती से बोलना, पर्ल में चर का डिफ़ॉल्ट स्कोपिंग पैकेज वैश्विक है। चर जिन्हें घोषित नहीं करना है । यह आपको पर्ल के दर्शन के बारे में बहुत कुछ बताता है। यह कार्य उन्मुख है और तेजी से प्रोटोटाइप और त्वरित और गंदे प्रोग्रामिंग पर एक्सेल है। आप जटिल कार्यों को करने के लिए कमांड लाइन पर पूरा कार्यक्रम लिख सकते हैं ( perl -e)। केवल एक मसोचिस्ट ही करेगा perl -e 'use strict; ...'। आप बस चर लिखते हैं और वे सिर्फ काम करते हैं। उन दार्शनिकों में से एक DWIM है - मैं क्या मतलब है। यह सबसे "हार्ड" प्रोग्रामिंग भाषाओं के पूर्ण विपरीत है जहां आपको कुछ भी करने से पहले दुनिया को परिभाषित करना होगा।

उसके बाद लैरी का अच्छा समय में हम कर ली strict, use vars, my, our, और stateचर के प्रबंधन को पूरा करने के। वे हमारे लिए काम करते हैं, न कि दूसरे तरीके से। वास्तव में इसे कठोर प्रोग्रामिंग माना जा सकता है ताकि ग्लोबल्स में कुछ डेटा न डाला जा सके। क्योंकि मैं जरूरी नहीं कि अगले आदमी से बेहतर जानता हूं और अगर वह मेरे कोड या मॉड्यूल को आत्मसात या संशोधित करना चाहता है, तो यह ठीक है और पड़ोसी है।

यहाँ पेरी के निर्माता लैरी वॉल द्वारा दी गई बातचीत के कुछ बहुत ही शिक्षाप्रद लिंक दिए गए हैं।

पर्ल, पहली उत्तर आधुनिक कंप्यूटर भाषा

पर्ल की संस्कृति

हालांकि गंभीर रूप से, अगर पर्ल संस्कृति में एक महत्वपूर्ण विचार कीटाणु है, तो यह इस प्रकार है: बहुत अधिक नियंत्रण केवल उतना ही घातक है जितना कम नियंत्रण। हमें नियंत्रण चाहिए और हमें अराजकता चाहिए।

प्रोग्रामिंग कठिन है, चलो स्क्रिप्टिंग जाओ ...

यूनिक्स शैल प्रोग्रामिंग की कुंठाओं ने सीधे पर्ल के निर्माण का नेतृत्व किया। मैंने पाया कि शेल स्क्रिप्टिंग आंतरिक रूप से इस तथ्य तक सीमित थी कि इसकी अधिकांश क्रियाएं इसके नियंत्रण में नहीं हैं और संज्ञाएं कमजोर हैं, जो तार और फाइलों तक सीमित हैं, जो जानते हैं-किस टाइपोलॉजी के साथ हैं। मैं एक बेवकूफ कंप्यूटर भाषा से बात नहीं करना चाहता। मैं चाहता हूं कि मेरी कंप्यूटर भाषा मेरे द्वारा लिखे गए तार को समझे।

अधिक जानकारी के लिए, perl.com पर जाएं