В каком порядке присваиваются ключи / значения? - PullRequest
2 голосов
/ 20 июня 2011
my %fruit_colors = ("apple", "red", "banana", "yellow");
my @fruits = keys %fruit_colors;
my @colors = values %fruit_colors;
print @fruits;            #output is: bananaapple
print "\n";
print @colors;            #output is: yellowred

Ссылка на кодовую панель: http://codepad.org/I0wrTPSe

Может кто-нибудь объяснить мне, почему вывод print @fruits; является банановым яблоком. Я думал, что это будет applebanana. Я думаю, что keys хеша %fruit_colors присваивается массиву @fruits в обратном порядке, то есть последний элемент назначается первым. Это так?

То же самое с print @colors; Почему желтеет вместо красного желтого?

Ответы [ 3 ]

10 голосов
/ 20 июня 2011

Порядок является недетерминированным и зависит от базовой реализации алгоритма хеширования, которая может быть изменена. Вы никогда не должны полагаться на порядок, и вы должны добавить свою собственную сортировку, если вам нужны отсортированные результаты.

См. Документацию perl здесь

7 голосов
/ 20 июня 2011

См. ключи perldoc -f . perldoc поставляется с Perl. При изучении языка полезно хотя бы сначала прочитать что-нибудь о языке:

Ключи хэша возвращаются в явно случайном порядке. Фактический случайный порядок может быть изменен в будущих версиях Perl, но он гарантированно будет того же порядка, что и значения, которые выдает каждая функция (учитывая, что хэш не был изменен). Начиная с Perl 5.8.1, порядок безопасности может быть разным даже для разных прогонов Perl по соображениям безопасности (см. Атаки алгоритмической сложности в perlsec).

3 голосов
/ 20 июня 2011

Роджер прав, говоря, что при работе с хешами Perl не может быть принят ни один ордер.

Кроме того, рекомендуется использовать жирные запятые при работе с хэшами, поэтому ваше первоначальное назначение должно выглядеть следующим образом:

my %fruit_colors = ("apple" => "red", "banana" => "yellow");

Представьте, что у вас есть хеш с 20 парами ключ / значение - как вы узнаете в паре 14, какой ключ является ключом, а какое значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...