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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top