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

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

Wenn ich den obigen Code auszuführen, ist das Ergebnis wie folgt:Warum legt Perls "Sortieren" diese Hash-Schlüssel nicht in numerischer Reihenfolge?

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

erwarte ich „10: 10“, der letzte zu sein, die gedruckt wird. Ich brauche nur jemanden, der erklärt, warum Perl mich in diesem Fall überrascht.

+6

Ein Hash mit den Schlüsseln 1..10 wird als Array bezeichnet. – jrockway

Antwort

-3

Vergessen Sie nicht, dass die Schlüssel in einem Perl-Hash werden immer als Strings gespeichert, so dass der Ausgang Sinn tut.

+6

Perl speichert sie beide als Zeichenfolgen _and_ als Zahlen. Das Problem hierbei ist, dass Sortierreihenfolgen standardmäßig sortiert werden. – mirod

+0

Die Schlüssel eines Hashes werden als Strings gespeichert, aber auch wenn sie als Zahlen gespeichert wurden, sortiert 'sort' immer noch mit Hilfe des String-Vergleichs. –

+0

Hash-Schlüssel sind keine SVs, also haben sie nicht die gleiche Magie wie normale Perl-Skalare. Deshalb können Sie beispielsweise Strings entwirren, indem Sie sie als Hash-Schlüssel verwenden und sie mit keys() wieder herausholen. –

Verwandte Themen