2013-09-26 7 views
11

Ich habe folgendes hash:Warum führt die Verkettung eines Hashs mit einer Zeichenfolge in Perl zu einem fraktionsähnlichen Ergebnis?

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

ich es dann drucken, wie so:

print "".%villains; 

ich folgende Ausgabe:

1/8 

Welche Semantik in Perl, damit dies geschieht?

Vielen Dank!

+6

Beachten Sie, dass Sie hier einen Schlüssel mit einem Verweis und keinem Wert zugewiesen haben. Wenn Sie den Hash-Inhalt in geschweifte Klammern setzen ('{' und '}'), wird eine _hash-Referenz_ zugewiesen, kein Hash. Sie deklarieren einen Hash und füttern ihn als _hash reference_. Sie werden also nie mehr als einen Eimer füllen. –

+0

Das ist eine sehr gute erste Frage. Gut gemacht! – simbabque

Antwort

13

Sie bewerten den Hash im skalaren Kontext. Wenn Sie dies tun, gibt es tatsächlich einen Bruchteil der Anzahl der Buckets zurück, die über die Gesamtzahl der Buckets berührt wurden, es sei denn, der Hash wurde nicht verwendet, in diesem Fall wird er als false ausgewertet. Weitere Informationen finden Sie unter this perldoc (am Ende des Abschnitts).

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.

Dieses etwas erklären für Unkundige mit Hash-Interna verwenden: Wenn Elemente auf einen Hash hinzugefügt werden, werden sie in Eimern angeordnet auf einem Hashing-Algorithmus basiert, so können sie mehr abgerufen werden effizient.

Beispiel

Sie sammeln Spielzeugautos. Um Ihre Autos schnell zu finden, haben Sie sich entschieden, sie in verschiedenen Eimern basierend auf Farbe zu setzen. Sie haben Eimer für Red, Gelb, Grün, Blau und Schwarz farbigen Autos.

Sie fügen einen neuen Grün Ford Mustang zu Ihrer Sammlung, so dass es in den Grün Eimer geht. Das nächste Mal, wenn Sie dieses Auto finden möchten, können Sie direkt zum Green Bucket gehen und eine kleinere Auswahl zum Durchsuchen haben.

In diesem Beispiel ist die Auto-Sammlung ein hash, jedes Auto ist ein hash entry und Farbe ist die hashing algorithm. Da die Sammlung auch rote, blaue und schwarze Autos enthält, sind sie ziemlich effizient angeordnet, unter Verwendung von 4/5 der Eimer.

Wenn Sie jedoch dieses System für eine Sammlung von roten Autos verwenden würden, wäre der Hashing-Algorithmus sehr ineffizient. Es würde nur 1/5 der Eimer verwenden und das Finden eines bestimmten Autos würde das Durchsuchen der gesamten Sammlung umfassen.