Проблема с хешами
В 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 обеспечивают некоторую степень упорядочения, но ценой существенного снижения производительности.