Хэши Perl используют технику, известную как цепочка ведер.Все ключи с одинаковым хешем (см. Макрос PERL_HASH_INTERNAL
в hv.h
) помещаются в один и тот же «сегмент», линейный список.
Согласно перданным документация
Если вы оцениваете хеш в скалярном контексте, он возвращает false, если хеш пуст.Если есть какие-либо пары ключ / значение, возвращается true;точнее, возвращаемое значение представляет собой строку, состоящую из числа используемых сегментов и количества выделенных сегментов, разделенных косой чертой.Это очень полезно только для того, чтобы выяснить, плохо ли работает алгоритм внутреннего хеширования Perl для вашего набора данных.Например, вы добавляете 10 000 вещей в хеш, но оценка %HASH
в скалярном контексте показывает "1/16"
, что означает, что было затронуто только одно из шестнадцати сегментов, и предположительно содержит все 10000 ваших элементов.Это не должно случиться.Если связанный хеш оценивается в скалярном контексте, это приведет к фатальной ошибке, поскольку эта информация об использовании сегмента в настоящее время недоступна для связанных хешей.
Чтобы увидеть, имеет ли ваш набор данных патологическое распределение, вы можетепроверить различные уровни в скалярном контексте, например, ,
print scalar(%$this), "\n",
scalar(%{ $this->{date} }), "\n",
scalar(%{ $this->{date}{"school 1"} }), "\n",
...
. Несколько устаревший обзор см. в Как реально работают хеши на perl.com.
Скромное сокращение длин имен учеников, клавиши на четыре уровня ниже, не будет иметь существенного значения.В общем, реализация Perl имеет сильный уклон к выбрасыванию памяти при проблемах.Это не Фортран твоего отца.