2010-09-02 9 views
10

से "हमारे" perldoc:फाइलों में "हमारी" दृश्यमान के साथ घोषित चर क्यों हैं?

हमारे मेरी के रूप में ही scoping नियम हैं, लेकिन जरूरी नहीं कि एक चर पैदा नहीं करता।

इसका मतलब है कि our के साथ घोषित चर को फाइलों में दिखाई नहीं देना चाहिए, क्योंकि फ़ाइल सबसे बड़ा शब्दावली का दायरा है। पर ये सच नहीं है। क्यूं कर?

उत्तर

14

आप एक पैकेज वैश्विक चर के लिए एक lexically-scoped उपनाम बनाने के लिए our पर विचार कर सकते हैं। पैकेज ग्लोबल्स हर जगह से सुलभ हैं; यही कारण है कि उन्हें वैश्विक बनाता है। लेकिन नाम our द्वारा बनाई our घोषणा के शाब्दिक दायरे के भीतर ही दिख रहा है।

package A; 
use strict; 
{ 
    our $var; # $var is now a legal name for $A::var 
    $var = 42; # LEGAL 
} 

say $var; # ILLEGAL: "global symbol $var requires explicit package name" 
say $A::var; # LEGAL (always) 

{ 
    our $var; # This is the same $var as before, back in scope 
    $var *= 2; # LEGAL 
    say $var; # 84 
} 
+1

धन्यवाद, अब मैं समझता हूं। –

+0

यह वास्तव में एक उपनाम है, अगर यह केवल 'सख्त' के लिए छूट है तो हमारे $ foo = 42 'perl -le'; पैकेज ए; प्रिंट करें "$ foo $ main :: foo" ' 42 42' वही चीज़ प्रिंट करेगा जैसे 'perl -le' vars qw/$ foo /; $ foo = 42; पैकेज ए; प्रिंट करें "$ foo $ main :: foo" '', जो एक छूट है, और हमें 'हमारी' आवश्यकता नहीं होगी। –

+0

@ चास अच्छा बिंदु। – hobbs

7

आप एक अच्छा जवाब पहले से ही है, लेकिन शायद इस रूप में अच्छी तरह उपयोगी होगा।

our घोषणा my और use vars के पहलुओं को जोड़ती है। यह use vars के समान काम करता है जिसमें यह पैकेज चर घोषित करता है; हालांकि, इस तरह से घोषित चर को स्पष्ट रूप से स्कॉप्ड किया गया है और उस दायरे से बाहर नहीं पहुंचा जा सकता है जिसमें उन्हें घोषित किया गया था (जब तक आप चर के पूर्ण योग्य नाम का उपयोग नहीं करते)। इसके अलावा, एक चर our साथ घोषित भी पैकेज सीमाओं भर में अपनी पूरी शाब्दिक गुंजाइश, पर दृश्यमान है।

यहाँ एक मेज है कि मैं अपने पर्ल को जोड़ा गया एक समय पहले नोटों है। उदाहरण के लिए, this SO answer देखें।

   Scope/  Package 
       Namespace Variable Private New 
--------------------------------------------------- 
my   Lexical No   Yes  Yes 
our   Lexical Yes   No   No 
use vars  Package Yes   No   No 
+3

लोग याद रखें कि संकुल एक गुंजाइश नहीं बना सकता है: [पता क्या एक गुंजाइश बनाता है] (http://www.effectiveperlprogramming.com/blog/48)। –

+0

@brian मैं अपना मुद्दा लेता हूं, और आपके द्वारा लिखे गए लेख एक अच्छा है, लेकिन मुझे आश्चर्य है कि पैकेज में कुछ गुंजाइश जैसी विशेषताएं हैं या नहीं। उदाहरण के लिए: 'perl -le 'पैकेज Foo; $ x + = 10; $ x प्रिंट करें; पैकेज बी; $ x + = 10; $ x' प्रिंट करें। शायद उस उदाहरण के साथ क्या चल रहा है इसका वर्णन करने के लिए "स्कोप" से बेहतर शब्द है? इनपुट के लिए धन्यवाद। – FMc

+0

बेहतर शब्द "डिफ़ॉल्ट पैकेज" है। पैकेज वैरिएबल की दृश्यता को सीमित नहीं करता है, हालांकि। यह बिल्कुल एक गुंजाइश की तरह नहीं है। –

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