2013-07-17 10 views
7

our संशोधक केवल तभी प्रयोग किया जाता है जब सख्त प्रगति वैश्विक चर का उपयोग करने के लिए सक्रिय है या यह सख्त बंद होने पर सामान्य वैश्विक चर से अलग कुछ अतिरिक्त सुविधाओं के लिए भी उपयोग किया जाता है?क्या पर्ल में हमारे परिभाषित चर और सामान्य वैश्विक चर के बीच कोई अंतर है?

उत्तर

5

हां, our घोषणाओं में अव्यवस्थित ग्लोबल्स की तुलना में अतिरिक्त सुविधाएं हो सकती हैं। लेकिन ये काफी हद तक अप्रासंगिक हैं।

our एक वैश्विक चर (एक ही नाम के) के लिए एक व्याख्यात्मक उपनाम बनाता है। यही है, package Foo, our $bar और $Foo::bar उसी वैरिएबल को देखें। हालांकि, पूर्व केवल तंग व्याख्यात्मक दायरे में उपलब्ध है।

our एक शाब्दिक प्रभाव पड़ता है के रूप में, उर्फ ​​भी शाब्दिक चर my साथ शैडो कर सकते हैं:

our $foo = 42; # give some value 
my $foo = -1; # same name, different value 
say "my gives $foo"; 
our $foo;  # reintroduce the alias; shadow lexical 
say "our gives $foo"; 

आप our घोषणाओं पट्टी और सख्त बिना चला, तो यह स्पष्ट रूप से उत्पादन नहीं देंगे

my gives -1 
our gives 42 

बस my, our थोड़ा अतिरिक्त घोषणा वाक्यविन्यास ले सकता है, उदाहरण के लिए गुण:

use threads::shared; 
our $foo :shared; 

तुम भी fields pragma के साथ उपयोग के लिए एक प्रकार का उल्लेख कर सकते हैं:

our Foo $foo; 

यह our बिना वैश्विक चर के लिए नहीं किया जा सकता।

+0

वास्तव में एक अच्छा जवाब! – none

2

आप perldocs से देख सकते हैं, our वर्तमान पैकेज में our एड चर रूप में एक ही नाम के साथ एक पैकेज चर करने के लिए एक उपनाम पैदा करता है।

यदि आप कोड लिख रहे हैं जिसमें इसमें कई पैकेज परिभाषाएं हैं, तो आप मॉड्यूल के बीच एक एलियाज्ड चर पारित करने के लिए our एड चर का उपयोग कर सकते हैं।

package Foo: 
our $bar = 42; # $bar is an alias for $Foo::bar 

package Baz; 
print $bar;  # prints '42', since $bar is $Foo::bar 

इस प्रकार, एक उपयोग जिसका वैश्विक चर के साथ कुछ लेना देना नहीं है।

+1

सभी पैकेज चर वैश्विक चर हैं। यह उपयोग क्या दर्शाता है कि 'सख्त' को संतुष्ट करने के अलावा 'हमारा' उद्देश्य है। – darch

+0

निम्नलिखित प्रश्नों के अनुसार (http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in-perl) हमारे चर पैकेज और वैश्विक चर कहा जाता है। मुझे नहीं पता कि कौन विश्वास करता है। – none

+0

@ नहीं: यहां कोई संघर्ष नहीं है। 'हमारी' घोषणा (एक उपनाम) पैकेज (वैश्विक) चर। – Borodin

2

वैश्विक, पैकेज चर कहीं भी पहुंच योग्य हैं, चाहे strict जगह पर है या नहीं, यदि आप पूरी तरह से योग्य नाम निर्दिष्ट करते हैं, यानी आप इसे पैकेज नाम से उपसर्ग करते हैं। तो मैं किसी भी समय कहीं भी $main::variable तक पहुंच सकता हूं।

strict के बिना, यदि आप $variable पर पहुंचते हैं कि आपने my के साथ घोषित नहीं किया है, तो पर्ल मानता है कि यह वर्तमान पैकेज में एक पैकेज चर है। our का उपयोग पैकेज चर को स्पष्ट रूप से घोषित करने के लिए किया जा सकता है, लेकिन strict के बिना यह बहुत कुछ नहीं करता है क्योंकि कुछ भी अव्यवस्थित समान व्यवहार करता है।

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

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