2012-02-21 12 views
10

Mi rendo conto che valutare un array in Perl in un contesto scalare è utile: risulta in un numero # di elementi.Qual è la ragione per valutare sempre un hash in Perl in un contesto scalare?

Ma quale è l'utilità pratica di poter valutare un hash in un contesto scalare? per esempio.

  • my $scalar_value = %hash;

  • scalar(%hash)

Per quanto ho capito, che produce una stringa come "3/4" dare alcune informazioni circa la struttura interna del hash che sembra essere utile solo per il debug.

+0

Qual è la differenza? –

+3

Un array è una variabile con un '@' sigil, una lista è una serie di elementi nel codice sorgente. in questo codice '@array = (1, 2, 3)', '(1, 2, 3)' è una lista e '@ array' è una variabile di matrice. perlfaq4 contiene ulteriori informazioni: http://perldoc.perl.org/perlfaq4.html#What-is-the-difference- between-a-list-and-an-array? –

+1

Ma non posso scrivere 'scalare (1,2,3,4)'? se questo è il caso, la "lista" era corretta in base alla tua affermazione, no? –

risposta

14

Produce un valore che può essere utilizzato come un flag VERO/FALSO per sapere se l'hash è vuoto (nessuna chiave).

Ad esempio:

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

if costringe l'espressione in un contesto scalare causa del suo uso come espressione booleana.

E 'un concetto molto simile ad usare @array in un contesto scalare per verificare il vuoto:

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

Dove "vuoto" significa "non ha chiavi". – tchrist

+0

@tchrist - ha aggiunto questo come chiarimento, ma sono un po 'in perdita su come si può interpretare "hash vuoto"? – DVK

+3

E 'la gente che va fuori di testa se '% h = (foo => undef)' indica qualcosa di diverso come uno scalare. Come se fossero weirdo su '@a = (undef)'. Ognuno di questi ha un indice valido, anche se non ha un valore valido. Quindi è il suo keycount che conta. – tchrist

1

lo scalare (% hash) permette di verificare se l'algoritmo di hashing funziona correttamente. Se hai 1.000 chiavi e vedi qualcosa come 2/16 significa che tutte le chiavi si stanno risolvendo solo a 2 dei 16 secchi assegnati. Ciò significa che tutte le chiavi sono molto simili e causano numerose collisioni, il che si traduce in lunghe ricerche sequenziali nel bucket.

conteggio secchio di default è 8

perl -le '$h{a}=1;print scalar %h' 
1/8 

Prestash l'hash con 1000 secchi (al potere più vicino di 2)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h' 
1/1024 

Questo aiuta anche quando si benedice un hash per Perl OO. Puoi accelerare le cose se sai che ci saranno molte chiavi.

Problemi correlati