2013-01-11 32 views
7

जब भी मैं अपनी चाबियों से हैश पर लूप करता हूं, और फिर प्रत्येक मान को प्रिंट करता हूं, तो मुझे "concatenation (।) या स्ट्रिंग ..." चेतावनी में अनियमित मूल्य का उपयोग मिलता है। भले ही हैश स्पष्ट रूप से सामने आया है। जो आउटपुट मैं चाहता हूं वह मुद्रित है, लेकिन मैं अभी भी जानना चाहता हूं कि इसका परिणाम चेतावनी में क्यों होता है, खासतौर पर एक मूल्य तक पहुंचने के रूप में (लूप के बाहर) बिना चेतावनियों के काम करता है।पर्ल - अपनी चाबियों से हैश पर लूपिंग क्यों करता है और फिर प्रत्येक मान परिणाम को एक अनियमित चेतावनी में प्रिंट करता है?

#!/usr/bin/perl 
use warnings; 
use strict; 

my %fruit =(); 
%fruit = ('Apple' => 'Green', 'Strawberry' => 'Red', 'Mango' => 'Yellow'); 

#works 
print "An apple is $fruit{Apple} \n"; 

#gives warnings 
foreach my $key (%fruit) 
{ 
    print "The color of $key is $fruit{$key} \n"; 
} 

#also gives warnings 
foreach my $key (%fruit) 
{ 
    my $value = $fruit{$key}; 
    print "$value \n"; 
} 

उपरोक्त कोड पर विचार करें। मुझे लगता है कि पर्ल पहले प्रिंट और दूसरे प्रिंट के बीच एक अंतर देखता है। पर क्यों? लूप के बाहर हैश के मूल्य को पुनर्प्राप्त करने और लूप के अंदर के मान को पुनर्प्राप्त करने के बीच कोई अंतर क्यों है?

धन्यवाद!

उत्तर

17

सूची संदर्भ में हैश का उपयोग करके दोनों कुंजी और मान उत्पन्न होते हैं। इसलिए लाइन foreach my $key (%fruit) कुंजी, मूल्य, कुंजी, मान पर पुनरावृत्त ...

आपको foreach my $key (keys %fruit) की आवश्यकता है।

+0

धन्यवाद! यह वास्तव में चाल है। महसूस नहीं किया :-)। – Gx1sptDTDa

2

for लूप के अंदर keys का उपयोग करें। जैसे foreach my $key (keys %fruit) ...

2

यह foreach my $key (keys %fruits) होना चाहिए। मुझे लगता है कि यह वही है जो आप वास्तव में करना चाहते हैं।