Perl, как гарантируют, возвратится последовательно заказанный ключи хеша?

Быть управляемым "использованием в качестве строгого модификатора, поскольку можно" постановить, что я использую внутренний везде, я должен получить доступ, скажем, к методу от другого класса, пока я явно не должен получать доступ к нему от другого блока.

, Поскольку интерфейс блока является обычно более узким, чем сумма его интерфейсов классов, существует вполне много мест, я использую его.

9
задан erjiang 10 August 2009 в 18:39
поделиться

3 ответа

Да . Из perldoc -f keys :

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

(выделено мной)

27
ответ дан 4 December 2019 в 08:34
поделиться

Это довольно рискованное ожидание. Вероятно, так и будет, но зачем волноваться? Заблаговременно выберите ключи, сохраните результат, затем переберите сохраненный результат. Тогда вам гарантирован доступ к ключам в том же порядке. Работать с краями неопределенных деталей реализации опасно.

EDIT: пропущена «гарантия» в документе, но я все же думаю опасно ожидать, что это никогда не изменится. Особенно когда есть более разумные способы достичь тех же целей.

-2
ответ дан 4 December 2019 в 08:34
поделиться

Изменить:

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


Хотя порядок хеш-ключей не меняется, вам, вероятно, следует пересмотреть, зачем вам это нужно.

Может быть, вы сможете обработать хеш за один проход вместо двух?

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

   my @keys = sort keys %myHash;

Это позволяет избежать проблем с изменением хэша, поскольку порядок вашего массива никогда не изменится, если вы этого не хотите.

Если вы этого не сделаете, вам нужно быть очень осторожным, чтобы не делать ничего, что изменяет хеш, иначе порядок элементов изменится. Загляните в модуль Только для чтения , чтобы убедиться, что этот хэш никогда не изменялся.

0
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: