В чем причина когда-либо оценивать хэш в Perl в скалярном контексте?
Я понимаю, что оценка массива в Perl в скалярном контексте полезна: это приводит к # элементам.
Но каково практическое использование возможности оценивать хэш в скалярном контексте? например.
Насколько я понимаю, он создает строку типа "3/4
", дающую некоторую информацию о внутренних элементах хэша, которая кажется полезной только для отладки.
Ответы
Ответ 1
Он выдает значение, которое может использоваться как флаг TRUE/FALSE, чтобы узнать, пустой ли хэш (без клавиш).
В качестве примера:
if (%hash) {
print "Hash has elements\n";
} else {
print "Hash is empty\n";
}
if
принуждает выражение к скалярному контексту из-за его использования в качестве булевого выражения.
Это очень похожая концепция использования @array
в скалярном контексте для проверки пустоты:
if (@array) {
# NOT empty!
}
Ответ 2
Скалярный (% hash) позволяет проверить правильность работы алгоритма хэширования. Если у вас 1000 клавиш, и вы видите что-то вроде 2/16, это означает, что все ключи разрешаются только двум из 16 выделенных ковшей. Это означает, что все ваши ключи очень похожи и вызывают много столкновений, что приводит к длительным последовательному поиску в ведре.
Количество ковша по умолчанию - 8
perl -le '$h{a}=1;print scalar %h'
1/8
Престаш хэш с 1000 ведрами (до ближайшей мощности 2)
perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024
Это также помогает, когда вы благословляете хэш для perl OO.
Вы можете ускорить процесс, если знаете, что будет много ключей.