2010-03-09 8 views
8
#!/usr/bin/perl 
use strict; 
use warnings; 

my %hash; 
foreach (1 .. 10) { 
    $hash{$_} = $_; 
} 
foreach (sort(keys %hash)) { 
    print $_ . ": " . "$hash{$_}" . "\n" ; 
} 

जब मैं ऊपर कोड निष्पादित, परिणाम के रूप में नीचे है: ": 10 10" पिछले एक है कि छपा है होना करने के लिएपर्ल की "सॉर्ट" ने इन हैश कुंजियों को संख्यात्मक क्रम में क्यों नहीं रखा?

 
1: 1 
10: 10 
2: 2 
3: 3 
4: 4 
5: 5 
6: 6 
7: 7 
8: 8 
9: 9 

मैं उम्मीद करते हैं। मुझे बस किसी को यह बताने की जरूरत है कि पर्ल मुझे इस मामले में आश्चर्य क्यों देता है।

+6

कुंजी 1.10 के साथ हैश को सरणी कहा जाता है। – jrockway

उत्तर

36

sort हमेशा defaults to string comparison

यदि आप संख्यात्मक प्रकार चाहते हैं, तो आपको स्पष्ट होना होगा।

sort {$a <=> $b} (keys %hash) 
-3

भूल जाते हैं कि एक पर्ल हैश में कुंजी हमेशा तारों के रूप में जमा हो जाती है तो उत्पादन मेकअप भावना करता है।

+6

पर्ल उन्हें संख्याओं के रूप में स्ट्रिंग _and_ दोनों के रूप में स्टोर करता है। यहां समस्या यह है कि डिफ़ॉल्ट रूप से तारों को क्रमबद्ध करता है। – mirod

+0

हैश की चाबियाँ स्ट्रिंग्स के रूप में संग्रहीत की जाती हैं, लेकिन भले ही उन्हें संख्याओं के प्रकार के रूप में संग्रहीत किया गया हो, फिर भी स्ट्रिंग तुलना का उपयोग करके टाइप किया जाता है। –

+0

हैश कुंजी एसवी नहीं हैं, इसलिए उनके पास सामान्य पर्ल स्केलर के समान जादू नहीं है। यही कारण है कि, उदाहरण के लिए, आप उन्हें हैश कुंजी के रूप में उपयोग करके तारों को अनदेखा कर सकते हैं और उन्हें कुंजी() के साथ वापस ले जा सकते हैं। –

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