2010-10-18 17 views
5

मैं निम्नलिखित (एक बग से आदर्शवादी) लघु पर्ल में स्क्रिप्ट है:मेरा हैश क्यों नहीं है?

my %metadata = undef; 
if (defined %metadata) 
{ 
    print "defined"; 
} 

किसी कारण कार्यक्रम के उत्पादन में हमेशा "परिभाषित" जाता है। तो हैश को "अपरिभाषित" होने के लिए किसी भी तरह से परिभाषित किया गया है। क्या इसे "अपरिभाषित" कहा जाता है?

संपादित करें:

यह आर्दश मामला है, समस्या को दोहराने के प्रयास में है। ,

my %metadata = my_sub_function(); 
if (defined %metadata) 
{ 
    print "defined"; 
} 

my_sub_function के उत्पादन में कहाँ undef हो सकता है() या एक आबादी वाले हैश, और मैं केवल करने के लिए इन मामलों में से आखिरी में "परिभाषित" प्रिंट चाहते हैं: क्या मैं वास्तव में कर रहा हूँ और अधिक की तरह है।

संपादित करें 2:

संयोग से मैं undef के लिए पाया है कि

if (scalar(keys %metadata) 

के लिए सही ढंग से कार्य(), लेकिन अभी भी नहीं।

+3

करता है 'मैं करने के लिए undef' एक' वापसी कर my_sub_function' अंडाकार विफलता या कोई डेटा नहीं? यदि ऐसा है, तो शायद इसके बजाय इसे एक नंगे 'वापसी' करना चाहिए। इसे स्केलर संदर्भ में 'undef' और सूची संदर्भ में'() '(खाली सूची) के रूप में व्याख्या किया जाएगा। –

उत्तर

8

अपने कार्य undef वापस आती है और कि undef हैश, ऑटो stringification परिवर्तन है कि '' होने की यूएनडीईएफ में रखा गया है और आप के साथ खत्म हो तो: %metadata = ('' => undef)

अपने कार्य जरूरत वापस जाने के लिए या तो undef, () या एक उचित हैश और आप अलग से तीनों मामलों का परीक्षण करने की जरूरत है, मेरा सुझाव चाहते हैं:

my %metadata = my_sub_function(); 
if (!scalar keys %metadata) { 
    print "An empty list() was returned\n" 
} elsif (
    scalar keys %metadata == 1 and 
    exists $metadata{''} and 
    !defined $metadata{''} 
) { 
    print "undef or '' was returned\n"; 
} else { 
    print "A hash was hopefully returned\n"; 
} 

आप निम्न my_sub_functions साथ यह परीक्षण कर सकते हैं :

sub my_sub_function { return()     } # 1st case 
sub my_sub_function { return undef    } # 2nd case 
sub my_sub_function { return (a => 1, b => 2) } # 3rd case 
sub my_sub_function { return qw/not a hash/  } # unhandled case 

हैप्पी हैकिंग

+1

अद्भुत; बहुत बहुत धन्यवाद! पर्ल हमेशा मुझे पकड़ता है कि यह कितनी आसान चीजें बनाता है, और कुछ चीजें कितनी मुश्किल होनी चाहिए :) –

8

my %metadata; 
undef %metadata; 
if (defined %metadata) 
{ 
    print "defined"; 
} 

प्रयास करें मुझे लगता है कि यह सिर्फ उपयोग कर रहा था एक "undef" डेटा हैश पॉप्युलेट करने के लिए के रूप में।

"उपयोग चेतावनी" कहा है |:

defined(%hash) is deprecated at t.pl line 6. 
    (Maybe you should just omit the defined()?) 
Odd number of elements in hash assignment at t.pl line 4. 
Use of uninitialized value in list assignment at t.pl line 4. 

undef,() या एक आबादी वाले हैश

तुम सच में एक खाली हैश और कोई हैश के बीच अंतर करना चाहते हैं बेहतर, एक हैश संदर्भ का उपयोग करें (सबराउटिन से पास करने के लिए हल्का, कोई पास-बाय-कॉपी और सभी)।

+0

आह, दिलचस्प! मैंने अपने लॉग में यह त्रुटि नहीं देखी है, और जिस कोड से यह आता है वह सख्त और चेतावनियों का उपयोग करता है। मैंने बिना किसी परिणाम के परिभाषित (% हैश) के बिना भी कोशिश की है। –

+0

दुर्भाग्य से मैं उप-फ़ंक्शन से सीधे वापस आने के प्रभारी नहीं हूं, इसलिए मुझे जो कुछ दिया गया है उसके साथ काम करना है :) –

+0

"समेकित (हैश और सरणी) पर परिभाषित उपयोग का उपयोग बहिष्कृत किया गया है। यह रिपोर्ट करने के लिए उपयोग किया जाता था क्या उस योग के लिए स्मृति आवंटित की गई है। यह व्यवहार पर्ल के भविष्य के संस्करणों में गायब हो सकता है। इसके बजाय आपको आकार के लिए एक सरल परीक्षण का उपयोग करना चाहिए "। तो, आपका वर्तमान दृष्टिकोण बहुत अच्छा काम नहीं कर सकता है। उन सबराउटिन बनाने वाले लोगों से बेहतर बात करें। – Thilo

1

इस

%metadata=("1"=>"one"); 
undef %metadata; 
if (%metadata) 
{ 
    print "defined"; 
} 

कोशिश और अगर आप perldoc -f defined पर दस्तावेज़ीकरण को देखें, तो यह जाँच के इस तरीके का बहिष्कार कर रही है।

Use of "defined" on aggregates (hashes and arrays) is deprecated. 
2

अगर आप defined के दस्तावेज़ देखें, तो आप उस मिलेगा,

When defined used on a hash element, 
it tells you whether the value is defined, 
not whether the key exists in the hash. 

सरल कोशिश, if (%a_hash) { print "has hash members\n" }

नोट: undef एक चर है कि शुरू कर दिया गया कभी नहीं का मूल्य है (या undef फ़ंक्शन का उपयोग कर रीसेट कर दिया गया है)। The defined function returns true if the value of the expression is not undef.

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