2010-02-23 5 views
9

Sagen wir, ich hatte so etwas wie:Wie kann ich eine neue, leere Hash-Referenz in Perl erstellen?

# %superhash is some predefined hash with more than 0 keys; 
%hash =(); 
foreach my $key (keys %superhash){ 
    $superhash{ $key } = %hash; 
    %hash =(); 
} 

würde alle Tasten von superhash auf den gleichen leeren Hash von %hash zugegriffen oder sie würden anders leer Hashes sein?

Wenn nicht, wie kann ich sicherstellen, dass sie auf leere Hashes zeigen?

+0

@toolic entschuldigen. Der eigentliche Code, den ich hatte, war ein bisschen zu kompliziert zum Posten, also schrieb ich ihn für die Frage um. –

Antwort

16

Sie müssen den Operator \ verwenden, um einen Verweis auf mehrere Datentypen (Array oder Hash) aufzunehmen, bevor Sie ihn in einem einzigen Slot speichern können. Aber in dem Beispielcode, der angegeben wird, wäre jeder, wenn er referenziert wird, derselbe Hash.

Die Art und Weise der Datenstruktur zu initialisieren ist:

foreach my $key (keys %superhash) { 
    $superhash{ $key } = {}; # New empty hash reference 
} 

Aber Initialisierung wie dies weitgehend unnötig in Perl aufgrund autovivification (Schaffung geeigneter Objekte Container, wenn eine Variable als ein Behälter verwendet wird).

my %hash; 

$hash{a}{b} = 1; 

Jetzt %hash hat einen Schlüssel, 'a', die einen Wert von einem anonymen hashref hat, b => 1 den Schlüssel/Wert-Paar enthält. Arrays autovivify in der gleichen Weise.

+0

Einverstanden. Keine Notwendigkeit, einen zusätzlichen Hash um zu tragen, wenn Perl es nicht benötigt. – Zaid

+0

Wie würde ich auf die Schlüssel von $ hash {a} zugreifen? Wenn ich 'foreach my $ rk (Schlüssel $ hash {a}) {...} versuche, gibt es einen Fehler: der Typ muss Hash sein –

+0

Ah habe ich es:' $ deref = $ hash {a} 'und dann 'foreach $ key (Schlüssel% $ deref) {...' –

Verwandte Themen