В чем причина когда-либо оценивать хэш в Perl в скалярном контексте?

Я понимаю, что оценка массива в Perl в скалярном контексте полезна: это приводит к # элементам.

Но каково практическое использование возможности оценивать хэш в скалярном контексте? например.

  • my $scalar_value = %hash;

  • scalar(%hash)

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