क्याअस्तित्व और परिभाषित के बीच क्या अंतर है?
if (defined $hash{$key}) { }
और
if (exists $hash{$key}) { }
मैं जो उपयोग करने के लिए पता है जब बीच का अंतर है?
क्याअस्तित्व और परिभाषित के बीच क्या अंतर है?
if (defined $hash{$key}) { }
और
if (exists $hash{$key}) { }
मैं जो उपयोग करने के लिए पता है जब बीच का अंतर है?
यह 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()
बहुत कम बार प्रयोग किया जाता है। एक सेट के रूप में हैश का उपयोग करते समय शायद सबसे आम मामला है। जैसे
my %set = map { $_ => undef } 'a' .. 'z';
का उपयोग करते हुए सेट मूल्यों के लिए undef
में कुछ फायदे हैं।
undef
मान एक ही आवंटन साझा करते हैं (जो स्मृति को बचाता है)।exists()
परीक्षण थोड़ा तेज हैं (क्योंकि पर्ल को मूल्य पुनर्प्राप्त करने की आवश्यकता नहीं है, केवल यह निर्धारित करें कि एक है)।यह भी नुकसान आप सेट सदस्यता, जो और अधिक लिखना पड़ता है और यदि आप इसे भूल गलत काम करेंगे के लिए जाँच करने exists()
का उपयोग करना होगा है।
एक और जगह जहां exists
उपयोगी है एक मूल्य पुनर्प्राप्त करने का प्रयास करने से पहले लॉक हैश की जांच करना (जो अपवाद को ट्रिगर करेगा)।
रूप perldoc on exists
में कहा गया है:
एक अभिव्यक्ति है कि एक हैश का एक तत्व निर्दिष्ट करता है को देखते हुए, TRUE देता हैश में निर्दिष्ट तत्व कभी प्रारंभ कर दिया गया है, भले ही संबंधित मान अनिर्धारित रहता है।
एक हैश या सरणी तत्व केवल तभी सत्य हो सकता है जब यह परिभाषित और परिभाषित किया गया हो, केवल यह मौजूद है, लेकिन रिवर्स जरूरी नहीं है।
है यही कारण है, एक हैश एक अपरिभाषित तत्व हो सकते हैं, और यदि यह मामला है, defined
की जाँच करें false
वापस आ जाएगी, जबकि exists
की जाँच करें true
वापस आ जाएगी।
इसलिए, आप exists
का उपयोग करता है, तो आप को पता है किसी दिए गए प्रवेश defined
हैश में मौजूद है, और अगर आप जानना चाहते हैं कि दिए गए प्रविष्टि मौजूद है और परिभाषित किया गया है चाहते हैं तो इच्छा चाहिए।
हां। 'हैश' चेक करता है यदि हैश में दी गई कुंजी है, लेकिन इसका मूल्य क्या नहीं है, जबकि 'परिभाषित' दिए गए कुंजी पर मूल्य को देखता है और देखता है कि यह परिभाषित किया गया है या नहीं (और यदि कुंजी मौजूद नहीं है, यह एक 'undef' वापस आ जाता है, इसलिए यह कुंजी तब भी काम करता है जब कुंजी नहीं है।) –
यह उदाहरण अंतर दिखाता है। किसी भी संरचना और अस्तित्व के लिए सामान्य परिभाषित कार्यों में हैश से संबंधित है।
my %hash=("1"=>undef);
print "exists:".exists($hash{"1"})."\n";
print "defined:".defined($hash{"1"})."\n";
अंतर छोटा है और इतना स्पष्ट नहीं है, इसलिए उम्मीद है कि लोग इसके साथ गड़बड़ करेंगे।
पर्ल documentation:
जब एक हैश तत्व पर इस्तेमाल किया, परिभाषित बताता मूल्य परिभाषित किया गया है, नहीं कुंजी हैश में मौजूद है कि क्या आप या नहीं। बाद के उद्देश्य के लिए का उपयोग करें।
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
और' $ हैश {$ foo} परिभाषित किया गया है; # झूठा 'मुझे लगता है? –
@ सांड्रा हां, अनियमित मान हमेशा अनिर्धारित होते हैं। इसके बारे में घोषणा और प्रारंभिकरण के बीच अंतर के रूप में सोचें: 'मेरा $ var' मौजूद है, और इसमें' undef' मान शामिल है। 'मेरा $ var = 0' मौजूद है, और इसलिए मान 0 है, इसलिए परिभाषित किया गया है। – TLP
'$ हैश {$ कुंजी}' '$ कुंजी' के लिए मान देता है। हालांकि इसे एक बूलियन के रूप में व्याख्या किया जा सकता है, यह एक नहीं है। आपका पहला उदाहरण 'undef', दूसरा एक '0' वापस करना चाहिए। –
बहुत अच्छी तरह से समझाया। –
इसके अलावा, 'परिभाषित' का उपयोग अन्य प्रकार के चरों पर भी किया जा सकता है, जबकि 'मौजूद' हैश या सरणी कुंजी (या एक सबराउटिन) पर उपयोग नहीं होने पर त्रुटि को फेंक देगा। – felwithe