2010-01-23 5 views
7

मुझे यह निर्धारित करने की आवश्यकता है कि एक पर्ल हैश की एक दी गई कुंजी है, लेकिन उस कुंजी को एक अपरिचित मान में मैप किया जाएगा। विशेष रूप से, इसके लिए प्रेरणा यह देख रही है कि getopt() का उपयोग करते समय बूलियन झंडे हैं, जिसमें हैश संदर्भ इसके साथ पास हो गया है। मैंने पहले ही इस साइट और Google दोनों को खोजा है, और exists() और defined() स्थिति के लिए लागू प्रतीत नहीं होता है, वे सिर्फ देखते हैं कि किसी दिए गए कुंजी के लिए मान अनिर्धारित है, तो वे जांच नहीं करते हैं कि हैश वास्तव में है या नहीं कुंजी। अगर मैं यहां एक आरटीएफएम हूं, तो कृपया मुझे मैनुअल पर इंगित करें जो इसे समझाता है।मैं कैसे निर्धारित कर सकता हूं कि एक पर्ल हैश में एक अपरिभाषित मान के लिए एक महत्वपूर्ण मैपिंग है या नहीं?

उत्तर

26

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

गलत है या नहीं। यही कारण है कि वास्तव में क्या defined() करता है, लेकिन आप क्या चाहते हैं वास्तव में exists() करता है:

my %hash = (
    key1 => 'value', 
    key2 => undef, 
); 

foreach my $key (qw(key1 key2 key3)) 
{ 
    print "\$hash{$key} exists: " . (exists $hash{$key} ? "yes" : "no") . "\n"; 
    print "\$hash{$key} is defined: " . (defined $hash{$key} ? "yes" : "no") . "\n"; 
} 

पैदा करता है:

 
$hash{key1} exists: yes 
$hash{key1} is defined: yes 
$hash{key2} exists: yes 
$hash{key2} is defined: no 
$hash{key3} exists: no 
$hash{key3} is defined: no 

इन दोनों कार्यों के लिए दस्तावेज़ perldoc -f defined और perldoc -f exists पर कमांड लाइन पर उपलब्ध है (या perldoc perlfunc * पर सभी विधियों के लिए प्रलेखन पढ़ें। आधिकारिक वेब प्रलेखन यहाँ है:

* आप विशेष रूप से उल्लेख किया है के बाद से RTFM और आप पर्ल प्रलेखन के स्थानों के बारे में पता नहीं हो सकता है, मुझे यह भी कहना है जाने कि आप perldoc perl पर या http://perldoc.perl.org पर सभी perldocs की एक पूर्ण अनुक्रमणिका प्राप्त कर सकते हैं।

11

यदि मैं आपका प्रश्न सही तरीके से पढ़ रहा हूं, तो मुझे लगता है कि आप exists के बारे में उलझन में हैं।

, EXPR

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

उदाहरण के लिए:

use strict; 
use warnings; 

my %h = (
    foo => 1, 
    bar => undef, 
); 

for my $k (qw(foo bar baz)){ 
    print $k, "\n" if exists $h{$k} and not defined $h{$k}; 
} 
6

लघु जवाब:

if (exists $hash{$key} and not defined $hash{$key}) { 
    ... 
} 
संबंधित मुद्दे

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