Проблема с хешами

В perl хеши довольно удобное средство, но есть проблемма. Хеши автосортируются. Вот пример

#!/usr/bin/perl

my %tags = ();
%tags->{'perl'}='7';
%tags->{'php'}='19';
%tags->{'xml'}='3';
%tags->{'mySql'}='8';

теперь сделаем их вывод

while ( my ($key, $value) = each(%tags) ) {
        print "$key => $value";
}

bov$ ./tt.pl
php => 19
perl => 7
mySql => 8
xml => 3

как видим порядок их поменялся этот пример не так показателен когда я выводил 32 значения в котором были численные ключи, здесь хоть видна логика сортировки по алфавиту, там же я её и вовсе не заметил. Однако вернемся к примеру.
можно отсортировать по ключу.

foreach $key (sort(keys %tags)) {
	print $key, '=', $tags{$key}, "\n";
}

bov$ ./tt.pl
mySql=8
perl=7
php=19
xml=3

или даже получить размер масива

print "size of hash:  " . keys( %tags ) . ".\n";

но получить ту же последовательность добавления не получится, и вот грамотный ответ почему

Элементы хеша не стоят в каком-то конкретном порядке. Можете рассматривать их как стопку библиографических карточек. Верхняя половина каждой карточки — это ключ, а нижняя — значение. Каждый раз, когда вы помещаете в хеш значение, создается новая карточка. Когда нужно изменить значение, вы указываете ключ, и Perl находит необходимую карточку. Поэтому порядок карточек, по сути дела, роли не играет. Perl хранит все карточки (т.е. пары ключ-значение) в особом внутреннем порядке, который облегчает поиск конкретной карточки, поэтому при поиске не приходится просматривать все пары. Порядок хранения карточек изменять нельзя, так что даже и не пытайтесь

Модули типа IxHash и DB_fiIe обеспечивают некоторую степень упорядочения, но ценой существенного снижения производительности.

Иточник http://www.lnu.edu.ua/book/perl/g5.html

Leave a Reply