2015-01-10 2 views
1

Я новичок в Perl и я пытаюсь запустить этот образец пример из «Beginning Perl: Кертис Poe»Невозможно понять поведение Perl хэш заказа

#!/perl/bin/perl 

use strict; 
use warnings; 
use diagnostics; 

my $hero = 'Ovid'; 
my $fool = $hero; 
print "$hero isn't that much of a hero. $fool is a fool.\n"; 

$hero = 'anybody else'; 
print "$hero is probably more of a hero than $fool.\n"; 

my %snacks = (
    stinky => 'limburger', 
    yummy => 'brie', 
    surprise => 'soap slices', 
); 
my @cheese_tray = values %snacks; 
print "Our cheese tray will have: "; 
for my $cheese (@cheese_tray) { 
    print "'$cheese' "; 
} 
print "\n"; 

Выход указанного выше кода, когда я примерил моей windows7 системы с ActivePerl и codepad.org

Ovid isn't that much of a hero. Ovid is a fool. 
anybody else is probably more of a hero than Ovid. 
Our cheese tray will have: 'limburger''soap slices''brie' 

Я не ясно, с третьей линии, которая печатает «limburger''soap slices''brie», но хэш порядок, имеющий «limburger''brie»» мыльные ломтики ».

Пожалуйста, помогите мне разобраться.

ответ

6

Хеши не заказываются. Если вам нужен конкретный заказ, вам нужно использовать массив.

Например:

my @desc = qw(stinky yummy surprise); 
my @type = ("limburger", "brie", "soap slices"); 
my %snacks; 
@snacks{@desc} = @type; 

Теперь у вас есть типы в @type.

Конечно, Вы можете также использовать sort:

my @type = sort keys %snacks; 
6

perldoc perldata:

Хэши неупорядоченные коллекции скалярных значений, проиндексированных по их связанной строки ключа.

Вы можете использовать sort ключи или значения.

1

Я думаю, что ключ:

my @cheese_tray = values %snacks 

Из [1]:. http://perldoc.perl.org/functions/values.html «запись Хеша возвращается в явно случайном порядке Действительный случайный порядок является специфичным для данного хэша, точно таких же серий операций над двумя хэшами может привести к другому порядку для каждого хэша ».

Смежные вопросы