2011-06-29 15 views
5

मैं 2 डी सरणी के पहले तत्व को निकालने के लिए मानचित्र का उपयोग कर रहा हूं। यहां छोटा कोड स्निपेट है।इस मानचित्र व्यवहार को समझना

my $array = [ [1,11,111], [2,22], undef, [4] ]; 

my @firstList = map { (defined $_) && $_->[0] } @$array; 

तो यहाँ मैं नक्शा उम्मीद कर रहा हूँ एक सरणी मूल्य या तो $ सरणी के तत्व की undef या पहले तत्व के साथ तत्व होने लौटने के लिए।

लेकिन आउटपुट वही नहीं है जो मैं उम्मीद कर रहा हूं। अपरिचित के लिए, मुझे 'स्केलर' प्रकार का तत्व मिल रहा है।

यदि मैं निम्नलिखित ब्लॉक के साथ मानचित्र विवरण बदलता हूं, तो मुझे अपेक्षित परिणाम मिल रहा है।

my @firstList = map { $_->[0] } @$array; 

कृपया इन दो मानचित्र विवरणों के बारे में समझने में मेरी सहायता करें।

उत्तर

4

वे दोनों अंतिम ऑपरेशन के परिणाम को वापस कर देते हैं।

पहले के लिए, जब यह undef के लिए (defined $_) && $_->[0] मूल्यांकन करता है, यह देखता है कि defined $_ गलत है और बूलियन अभिव्यक्ति प्रसंस्करण बंद हो जाता है। इस मामले में $_->[0] का मूल्यांकन नहीं किया गया है। defined $_ अंतिम ऑपरेशन का मूल्यांकन किया गया था, और इसका परिणाम false था, जिसे मैं अनुमान लगा रहा हूं 0 के साथ दर्शाया गया है।

दूसरे के लिए, यह @$array के बच्चे से वास्तविक मूल्य है, जहां यह undef मान प्राप्त कर रहा है।

+0

एक छोटा सुधार: 'परिभाषित अपरिफ' रिटर्न ''''। – Dallaylaen

+2

मैं सोच रहा था कि क्यों अनिश्चित -> [0] काम करता है (यहां तक ​​कि 'सख्त' के तहत भी)। यह [autovivified] (http://en.wikipedia.org/wiki/Autovivification) को चालू करता है, यानी मूल सरणी ** में स्पष्ट रूप से '[]' ** पर सेट किया गया है। – Dallaylaen

+1

@ दलायलेन: यह पर्याप्त लोगों को भ्रमण करता है कि सीपीएएन के पास http://search.cpan.org/perldoc?autovivification पर एक "ऑटोविविफिकेशन" मॉड्यूल है जो आपको इसे 'नो ऑटोविविफिकेशन' आदेश से अक्षम करने की अनुमति देता है। –

0
map { (defined $_) && $_->[0] } 

वास्तव में सरणी में प्रत्येक तत्व के माध्यम से पुनरावृत्त करता है, और कुछ फ़ंक्शन या अभिव्यक्ति लागू करता है। आउट केस में यह निम्न कार्य है: defined($_) && $_->[0] यदि आपका सेल आपके सरणी में तीसरा सेल है, तो defined(undef) && $->[0] (जो '' के बराबर है, आप इसे आजमा सकते हैं ..) का मूल्यांकन करते हैं, जबकि दूसरा 1 && $->[0] का मूल्यांकन करता है जो $ -> [0 ]।

बीटीडब्लू, आपके सरणी के प्रत्येक सेल के लिए आपका दूसरा कथन काम करने का कारण भी है, आप पहले आंतरिक सेल का चयन करते हैं।

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