Qual é a razão para sempre avaliar um hash em Perl em um contexto escalar?
Pergunta
Eu percebi que avaliar um array em Perl em um contexto escalar é útil: resulta em um número de elementos.
Mas qual é a utilidade prática de ser capaz de avaliar um hash em um contexto escalar?por exemplo,
my $scalar_value = %hash;
scalar(%hash)
Pelo que eu entendi, ele produz uma string como "3/4
" fornecendo algumas informações sobre os detalhes internos do hash que parecem ser úteis apenas para depuração.
Solução
Ele produz um valor que pode ser usado como um sinalizador TRUE / FALSE para saber se o hash está vazio (sem chaves).
Por exemplo:
if (%hash) {
print "Hash has elements\n";
} else {
print "Hash is empty\n";
}
if
força a expressão em um contexto escalar devido ao seu uso como uma expressão booleana.
É um conceito muito semelhante ao uso de @array
em um contexto escalar para testar o vazio:
if (@array) {
# NOT empty!
}
Outras dicas
O escalar (% hash) permite que você verifique se o algoritmo de hash está funcionando corretamente.Se você tiver 1.000 chaves e vir algo como 2/16, isso significa que todas as chaves estão sendo resolvidas para apenas 2 dos 16 intervalos atribuídos.Isso significa que todas as suas chaves são muito semelhantes e causam muitas colisões, o que resulta em longas pesquisas sequenciais no intervalo.
A contagem de intervalos padrão é 8
perl -le '$h{a}=1;print scalar %h'
1/8
Faça o pré-flash do hash com 1000 baldes (com a potência de 2 mais próxima)
perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024
Isso também ajuda quando você abençoa um hash para perl OO. Você pode acelerar as coisas se souber que haverá muitas chaves.