2012-02-21 2 views
10

Я понимаю, что оценка массива в Perl в скалярном контексте полезна: это приводит к # элементам.В чем причина когда-либо оценивать хэш в Perl в скалярном контексте?

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

  • my $scalar_value = %hash;

  • scalar(%hash)

Насколько я понимаю, она производит строку типа «3/4» дает некоторую информацию о внутреннем хэша, что, как представляется, только полезным для отладки.

+0

В чем разница? –

+3

Массив - это переменная с символом '@', список - это серия элементов в исходном коде. в этом коде '@array = (1, 2, 3)', '(1, 2, 3)' - это список, а '@ array' - переменная массива. perlfaq4 содержит дополнительную информацию: http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array? –

+1

Но я не могу написать 'scalar (1,2,3,4)'? если это так, тогда «список» был правильным на основании вашего заявления, нет? –

ответ

14

Он генерирует значение, которое может использоваться как флаг TRUE/FALSE, чтобы узнать, пустой ли хэш (без ключей).

В качестве примера:

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

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

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

if (@array) { 
    # NOT empty! 
} 
+0

Где «пустое» означает «не имеет ключей». – tchrist

+0

@tchrist - добавил, что в качестве пояснения, но я немного теряю, как иначе можно интерпретировать «пустой хэш»? – DVK

+3

Это связано с тем, что люди страдают от того, что «% h = (foo => undef)» означает нечто иное как скаляр. То же самое, что они идут странно над '@a = (undef)'. Каждый из них имеет один действительный индекс, хотя и не действительный. Так что это его ключевой показатель, который имеет значение. – tchrist

1

Скалярного (% хеш) позволяет проверить, если алгоритм хэширования работает правильно. Если у вас 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. Вы можете ускорить процесс, если знаете, что будет много ключей.

 Смежные вопросы

  • Нет связанных вопросов^_^