Was ist der Grund, jemals einen Hash in Perl in einem skalaren Kontext auszuwerten?

StackOverflow https://stackoverflow.com/questions/9384695

  •  28-10-2019
  •  | 
  •  

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top