Warum hat ein leerer Perl-Hash einen Schlüssel?

8

Die googlefähige Standardantwort auf "Wie finde ich die Größe eines Hash in Perl heraus?" ist "nimm die Größe von keys(%hash) ":

%Vor%

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?

    
spraff 12.04.2011, 09:48
quelle

4 Antworten

20

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.

    
Greg Hewgill 12.04.2011, 09:49
quelle
24
%Vor%

strikte und Warnungen sind aus sehr guten Gründen in Perl enthalten. Es gibt keinen Grund, sie nicht zu benutzen.

Noch besser: Fügen Sie Diagnose in den Mix ein:

%Vor%     
Dave Cross 12.04.2011 11:09
quelle
7

{} 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) ).

    
Eugene Yarmash 12.04.2011 10:10
quelle
6
%Vor%

%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.

    
Alan Haggai Alavi 12.04.2011 10:10
quelle

Tags und Links