Die googlefähige Standardantwort auf "Wie finde ich die Größe eines Hash in Perl heraus?" ist "nimm die Größe von keys(%hash)
":
Dies druckt "1". Ich habe mit Null gerechnet. Andererseits. Ähnlich,
%Vor%Drucke:
3
Taste: a
Taste: x
Taste: HASH (0x229e8)
Woher kommt dieser zusätzliche Wert?
Das hat mich auch schon mal gebissen.
%Vor% Beachten Sie die Verwendung von ()
anstelle von {}
.
Erläuterung: Der Wert {}
ist eine Referenz für einen Hash und nicht für einen Hash selbst. In Perl ist eine Referenz eine Art Skalarwert und die Zuweisung zu %h
weist eine spezielle Verarbeitung zum Zuweisen eines einzelnen Skalarwerts auf. Es gibt den Skalar an (in Ihrem Fall gibt es die Zeichenfolge HASH(0x229e8)
) und verknüpft diesen Schlüssel mit dem Wert undef
.
Bei Verwendung von ()
werden durch die Zuweisung von Liste zu Hash Schlüssel / Wert-Paare aus Paaren in der Liste erstellt, und da ()
leer ist, wird der Hash %h
leer.
{}
ist eine Referenz auf einen anonymen Hash. Also my %h = {}
entspricht meinem %h = ({} => undef)
.
Perl benötigt Hash-Schlüssel als Zeichenfolgen. Wenn Sie also eine Referenz als Schlüssel verwenden, verwendet Perl die Zeichenfolgendarstellung der Referenz ( HASH(0x229e8)
).
%h
wird mit einer Hash-Referenz als Schlüssel und undef
als Wert zugewiesen.
Ausgabe:
%Vor% Wie rafl vorgeschlagen wurde, hätte das warnings
pragma dies erfasst.
Sehen Sie sich Greg Hewgill Antwort für den korrigierten Code.