Какова причина когда-либо оценивать хеш в Perl в скалярном контексте? - PullRequest
10 голосов
/ 22 февраля 2012

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

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

  • my $scalar_value = %hash;

  • scalar(%hash)

Насколько я понимаю, он генерирует строку типа "3/4", дающую некоторую информацию о внутренностях хэша, которая, по-видимому, полезна только для отладки.

Ответы [ 2 ]

14 голосов
/ 22 февраля 2012

Создает значение, которое можно использовать в качестве флага ИСТИНА / ЛОЖЬ, чтобы узнать, пустой ли хэш (без ключей).

Например:

if (%hash) {
    print "Hash has elements\n";
} else {
    print "Hash is empty\n";
}

if переводит выражение в скалярный контекст из-за его использования в качестве логического выражения.

Это очень похоже на использование @array в скалярном контексте для проверки на пустоту:

if (@array) {
    # NOT empty!
}
1 голос
/ 22 февраля 2012

Скаляр (% hash) позволяет проверить, правильно ли работает алгоритм хеширования. Если у вас 1000 ключей и вы видите что-то вроде 2/16, это означает, что все ключи разрешаются только в 2 из 16 выделенных сегментов. Это означает, что все ваши ключи очень похожи и вызывают много столкновений, что приводит к долгим последовательным поискам в корзине.

Количество сегментов по умолчанию: 8

perl -le '$h{a}=1;print scalar %h'
1/8

Prestash хеш с 1000 ведрами (до ближайшей степени 2)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024

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

...