Was ist der Grund, jemals einen Hash in Perl in einem skalaren Kontext auszuwerten?
Frage
Mir ist klar, dass das Auswerten eines Arrays in Perl in einem skalaren Kontext nützlich ist: Es führt zu einer Anzahl von Elementen.
Aber was nützt es praktisch, einen Hash in einem skalaren Kontext bewerten zu können?z.B.
-
my $scalar_value = %hash;
-
scalar(%hash)
Soweit ich weiß, wird eine Zeichenfolge wie "
3/4
" erzeugt, die einige Informationen zu den Interna des Hash enthält, die nur zum Debuggen nützlich zu sein scheinen.
Lösung
Es wird ein Wert erzeugt, der als TRUE / FALSE-Flag verwendet werden kann, um festzustellen, ob der Hash leer ist (keine Schlüssel).
Als Beispiel:
if (%hash) {
print "Hash has elements\n";
} else {
print "Hash is empty\n";
}
if
zwingt den Ausdruck aufgrund seiner Verwendung als boolescher Ausdruck in einen skalaren Kontext.
Es ist ein sehr ähnliches Konzept wie die Verwendung von @array
in einem skalaren Kontext, um die Leere zu testen:
if (@array) {
# NOT empty!
}
Andere Tipps
Mit dem Skalar (% Hash) können Sie überprüfen, ob der Hashing-Algorithmus ordnungsgemäß funktioniert.Wenn Sie 1.000 Schlüssel haben und so etwas wie 2/16 sehen, bedeutet dies, dass alle Schlüssel nur in 2 der 16 zugewiesenen Eimer aufgelöst werden.Dies bedeutet, dass alle Ihre Schlüssel sehr ähnlich sind und viele Kollisionen verursachen, was zu langen aufeinander folgenden Suchvorgängen im Bucket führt.
Die Standard-Bucket-Anzahl beträgt 8
perl -le '$h{a}=1;print scalar %h'
1/8
Verstecken Sie den Hash mit 1000 Eimern (auf die nächste Potenz von 2)
perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024
Dies hilft auch, wenn Sie einen Hash für Perl OO segnen. Sie können die Dinge beschleunigen, wenn Sie wissen, dass es viele Schlüssel geben wird.