В Perl, почему конкатенация хэша со строкой дает результат с фракцией?

У меня есть следующий хэш:

my %villains = {
    "Boba" => "Fett",
    "Darth" => "Vader",
    "Moff" => "Tarkin",
}

Затем я печатаю его так:

print "".%villains;

Я получаю следующий вывод:

1/8

Какая семантика в Perl делает это?

Спасибо!

Ответ 1

Вы оцениваете хэш в скалярном контексте. Когда вы это делаете, он фактически возвращает часть количества ковшей, затронутых общим количеством ведер, если хеш не был использован, и в этом случае он вычисляет значение false. См. этот perldoc для получения дополнительной информации (в конце раздела).

Ответ 2

Если вы оцениваете хэш в скалярном контексте, он возвращает false, если хеш пуст. Если есть пары ключ/значение, он возвращает true; точнее, возвращаемое значение представляет собой строку, состоящую из числа используемых ковшей и количества выделенных ведер, разделенных косой чертой. Это очень полезно, только чтобы выяснить, плохо ли работает алгоритм внутреннего хеширования Perl в вашем наборе данных.

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

Пример

Ты собираешь игрушечные машины. Чтобы легко найти ваши автомобили, вы решили поместить их в разные ковши по цвету. У вас есть ведра для цветных автомобилей Красный, Желтый, Зеленый, Синий и Черный..

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

В этом примере коллекция автомобилей - hash, каждый автомобиль - hash entry, а цвет - hashing algorithm. Поскольку коллекция также содержит красные, синие и черные автомобили, они устроены достаточно эффективно, используя 4/5 ведер.

Однако, если бы вы использовали эту систему для коллекции красных автомобилей, алгоритм хеширования был бы очень неэффективным. Он использовал бы только 1/5 ведер, и поиск конкретного автомобиля включал бы поиск по всей коллекции.