2013-09-26 8 views
11

Ho la seguente hash:In Perl, perché concatenare un hash con una stringa dà un risultato dall'aspetto frazionario?

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

ho quindi stamparlo in questo modo:

print "".%villains; 

ottengo il seguente output:

1/8 

Cosa semantica in Perl rendere questo accada?

Grazie!

+6

Nota che qui è stato assegnato un tasto con un riferimento e nessun valore. Mettere il contenuto dell'hash in parentesi graffe ('{' e '}') ha assegnato un _shsh reference_, non un hash. Dichiari un hash e lo mandi un riferimento _hash_. Quindi non avrai mai riempito più di un secchio. –

+0

Questa è una ottima prima domanda. Molto bene! – simbabque

risposta

13

Si sta valutando l'hash in contesto scalare. Quando si esegue questa operazione in realtà restituisce una frazione del numero di bucket toccati sul numero totale di bucket, a meno che l'hash non sia stato utilizzato nel qual caso viene valutato come falso. Vedi this perldoc per maggiori informazioni (vicino alla fine della sezione).

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.

Questo potrebbe usare qualche spiegazione per chiunque ha familiarità con interni di hash: Quando gli elementi vengono aggiunti a un hash, sono disposti in segmenti in base a un algoritmo di hashing in modo che possano essere recuperati più in modo efficiente.

Esempio

Stai raccogliendo macchinine. Per trovare facilmente le tue auto hai deciso di metterle in diversi secchi in base al colore. Hai secchi per Red, Giallo, Verde, Blu e Nero automobili colorate.

si aggiunge un nuovo verde Ford Mustang alla vostra collezione così va nel verde secchio . La prossima volta che vuoi trovare questa macchina, puoi andare direttamente al secchio Verde e avere una selezione più piccola da cercare.

In questo esempio la collezione di auto è una hash, ogni auto è una hash entry e il colore è hashing algorithm. Poiché la collezione contiene anche auto rosse, blu e nere, sono disposte in modo abbastanza efficiente, utilizzando lo 4/5 dei secchi.

Tuttavia, se si dovesse utilizzare questo sistema per una raccolta di auto rosse, l'algoritmo di hash sarebbe molto inefficiente. Userebbe solo 1/5 delle benne e trovare un'auto particolare implicherebbe la ricerca attraverso l'intera raccolta.

Problemi correlati