2011-06-30 24 views

उत्तर

76

यह defined और exists के लिए perldoc प्रविष्टियों में अच्छी तरह से प्रलेखित है। यहां एक त्वरित सारांश दिया गया है:

defined $hash{key} आपको बताता है कि दी गई कुंजी के मान को परिभाषित किया गया है या नहीं (यानी undef)। 0 और '' जैसे बूलियन संदर्भ में गलत अपरिभाषित मानों और मानों के बीच अंतर करने के लिए इसका उपयोग करें।

exists $hash{key} आपको बताता है कि %hash में दी गई कुंजी है या नहीं। अपरिभाषित मूल्यों और अस्तित्वहीन लोगों के बीच अंतर करने के लिए इसका उपयोग करें।

उदाहरण के साथ देखना सबसे आसान है। इस हैश को देखते हुए:

my %hash = (a => 1, b => 0, c => undef); 

यहाँ पुनः प्राप्ति के लिए परिणाम, परिभाषित सत्ता, और अस्तित्व:

# key value defined exists 
a   1  1  1 
b   0  1  1 
c  undef  0  1 
d  undef  0  0 

अभ्यास में, लोगों को अक्सर बस if ($hash{key}) {...} क्योंकि (कई आम मामलों में) लिखना ही सच्चा मान सार्थक/संभव हैं। यदि गलत मान मान्य हैं तो परीक्षण में defined() जोड़ें। exists() बहुत कम बार प्रयोग किया जाता है। एक सेट के रूप में हैश का उपयोग करते समय शायद सबसे आम मामला है। जैसे

  1. यह और अधिक सही इरादे (केवल चाबियाँ सार्थक, मूल्यों नहीं हैं) का प्रतिनिधित्व करता है:

    my %set = map { $_ => undef } 'a' .. 'z'; 
    

    का उपयोग करते हुए सेट मूल्यों के लिए undef में कुछ फायदे हैं।

  2. सभी undef मान एक ही आवंटन साझा करते हैं (जो स्मृति को बचाता है)।
  3. exists() परीक्षण थोड़ा तेज हैं (क्योंकि पर्ल को मूल्य पुनर्प्राप्त करने की आवश्यकता नहीं है, केवल यह निर्धारित करें कि एक है)।

यह भी नुकसान आप सेट सदस्यता, जो और अधिक लिखना पड़ता है और यदि आप इसे भूल गलत काम करेंगे के लिए जाँच करने exists() का उपयोग करना होगा है।

एक और जगह जहां exists उपयोगी है एक मूल्य पुनर्प्राप्त करने का प्रयास करने से पहले लॉक हैश की जांच करना (जो अपवाद को ट्रिगर करेगा)।

+0

बहुत अच्छी तरह से समझाया। –

+0

इसके अलावा, 'परिभाषित' का उपयोग अन्य प्रकार के चरों पर भी किया जा सकता है, जबकि 'मौजूद' हैश या सरणी कुंजी (या एक सबराउटिन) पर उपयोग नहीं होने पर त्रुटि को फेंक देगा। – felwithe

4

रूप perldoc on exists में कहा गया है:

एक अभिव्यक्ति है कि एक हैश का एक तत्व निर्दिष्ट करता है को देखते हुए, TRUE देता हैश में निर्दिष्ट तत्व कभी प्रारंभ कर दिया गया है, भले ही संबंधित मान अनिर्धारित रहता है।

एक हैश या सरणी तत्व केवल तभी सत्य हो सकता है जब यह परिभाषित और परिभाषित किया गया हो, केवल यह मौजूद है, लेकिन रिवर्स जरूरी नहीं है।

है यही कारण है, एक हैश एक अपरिभाषित तत्व हो सकते हैं, और यदि यह मामला है, defined की जाँच करें false वापस आ जाएगी, जबकि exists की जाँच करें true वापस आ जाएगी।

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

+1

हां। 'हैश' चेक करता है यदि हैश में दी गई कुंजी है, लेकिन इसका मूल्य क्या नहीं है, जबकि 'परिभाषित' दिए गए कुंजी पर मूल्य को देखता है और देखता है कि यह परिभाषित किया गया है या नहीं (और यदि कुंजी मौजूद नहीं है, यह एक 'undef' वापस आ जाता है, इसलिए यह कुंजी तब भी काम करता है जब कुंजी नहीं है।) –

3

यह उदाहरण अंतर दिखाता है। किसी भी संरचना और अस्तित्व के लिए सामान्य परिभाषित कार्यों में हैश से संबंधित है।

my %hash=("1"=>undef); 
print "exists:".exists($hash{"1"})."\n"; 
print "defined:".defined($hash{"1"})."\n"; 

अंतर छोटा है और इतना स्पष्ट नहीं है, इसलिए उम्मीद है कि लोग इसके साथ गड़बड़ करेंगे।

5

पर्ल documentation:

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

14

defined चेकों चर का मान, exists जांच करता है कि यह पहले से घोषित किया गया है/प्रारंभ। यदि यह अस्तित्व में है, सादा और सरल।

उदा .:

$hash{$key} = undef; 
# various return values: 
exists $hash{$key}; # true 
defined $hash{$key}; # false 
$hash{$key};   # false 

$hash{$key} = 0; 
# various return values: 
exists $hash{$key}; # true 
defined $hash{$key}; # true 
$hash{$key};   # false 
exists $hash{$foo}; # false 
+0

और' $ हैश {$ foo} परिभाषित किया गया है; # झूठा 'मुझे लगता है? –

+2

@ सांड्रा हां, अनियमित मान हमेशा अनिर्धारित होते हैं। इसके बारे में घोषणा और प्रारंभिकरण के बीच अंतर के रूप में सोचें: 'मेरा $ var' मौजूद है, और इसमें' undef' मान शामिल है। 'मेरा $ var = 0' मौजूद है, और इसलिए मान 0 है, इसलिए परिभाषित किया गया है। – TLP

+0

'$ हैश {$ कुंजी}' '$ कुंजी' के लिए मान देता है। हालांकि इसे एक बूलियन के रूप में व्याख्या किया जा सकता है, यह एक नहीं है। आपका पहला उदाहरण 'undef', दूसरा एक '0' वापस करना चाहिए। –

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