2013-09-26 2 views
11

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

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

Я затем распечатать его следующим образом:

print "".%villains; 

я получаю следующий результат:

1/8 

Что семантика в Perl чтобы это произошло?

Спасибо!

+6

Обратите внимание, что вы назначили один ключ здесь с ссылкой и без значения. Помещение содержимого хеша в фигурные скобки ('{' и '}') присваивало _hash reference_, а не хэш. Вы объявляете хэш и кормите его ссылкой _hash_. Таким образом, вы никогда не получите больше одного ведра. –

+0

Это очень хороший первый вопрос. Отлично сработано! – simbabque

ответ

13

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

4

If you evaluate a hash in scalar context, it returns false if the hash is empty. If there are any key/value pairs, it returns true; more precisely, the value returned is a string consisting of the number of used buckets and the number of allocated buckets, separated by a slash. This is pretty much useful only to find out whether Perl's internal hashing algorithm is performing poorly on your data set.

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

Пример

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

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

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

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