2011-12-12 6 views
14

जहाँ तक मुझे पता है, my ऑपरेटर वेरिएबल घोषित करने के लिए local ऑपरेटर का उपयोग कर चरम रूप से स्कॉप्ड और डायनामिक स्कोपिंग कर रहे चर को घोषित करना है।पर्ल में व्याख्यात्मक और गतिशील स्कोपिंग के बीच क्या अंतर है?

क्या कोई भी संक्षेप में उनका वर्णन कर सकता है?

उत्तर

11

स्थानीय ($ x) के वैश्विक चर $ x वर्ष मूल्य दूर बचत होती है और सबरूटीन की अवधि जो अन्य कार्यों कि सबरूटीन से कहा जाता है में दिख रहा है के लिए एक नया मूल्य प्रदान करती है। यह रन-टाइम पर किया जाता है, इसलिए गतिशील स्कॉइंग कहा जाता है। स्थानीय() हमेशा वैश्विक चर को प्रभावित करता है, जिसे पैकेज चर या गतिशील चर भी कहा जाता है।

मेरा ($ x) एक नया चर बनाता है जो केवल वर्तमान सबराउटिन में दिखाई देता है। यह संकलन समय पर किया जाता है, इसलिए इसे लेक्सिकल या स्थैतिक स्कोपिंग कहा जाता है। मेरा() हमेशा निजी चर को प्रभावित करता है, जिसे लेक्सिकल चर या (अनुचित रूप से) स्थिर (ly scoped) चर भी कहा जाता है।

Perl-FAQ's पर एक नज़र डालें:

+0

आपको बहुत धन्यवाद – Anil

+6

"मेरा ($ x) एक नया चर बनाता है जो केवल वर्तमान सबराउटिन में दिखाई देता है"। वह सत्य नहीं है। 'मेरा' एक नया चर बनाता है जो केवल वर्तमान * कोड * ब्लॉक में दिखाई देता है। एक subroutine एक ब्लॉक का केवल एक उदाहरण है। आप 'स्थानीय' की अपनी परिभाषा में एक समान त्रुटि करते हैं। –

+0

@ ओ.डी. http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP

3

मैं एक त्वरित उदाहरण जोड़ूंगा।

$var = "Global"; 

sub inner { 
    print "inner:   $var\n"; 
} 

sub changelocal { 
    my $var = "Local"; 
    print "changelocal: $var\n"; 

    &inner 
} 

sub changedynamic { 
    local $var = "Dynamic"; 
    print "changedynamic: $var\n"; 

    &inner 
} 

&inner 
&changelocal 
&changedynamic 

यह निम्नलिखित आउटपुट (टिप्पणियां जोड़ा गया) देता है।

inner:   Global # Finds the global variable. 
changedynamic: DynamiC# Dynamic variable overrides global. 
inner:   DynamiC# Find dynamic variable now. 
changelocal: Local # Local variable overrides global. 
inner:   Global # The local variable is not in scope so global is found. 

आप एक गतिशील चर के बारे में सोच सकते हैं जो आपके द्वारा कॉल किए जाने वाले कार्यों के लिए वैश्विक रूप से मुखौटा करने के तरीके के रूप में सोच सकता है। जहां लेक्सिकल स्कॉप्ड वैरिएबल केवल निकटतम ब्रेसिज़ के अंदर कोड से दिखाई दे सकते हैं।

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