Wie erstelle ich einen Hash von Hashes in Perl?

7

Basierend auf meinem derzeitigen Verständnis von Hashes in Perl würde ich erwarten, dass dieser Code "Hallo Welt" ausgibt. Es druckt stattdessen nichts.

%Vor%

Ich nehme an, dass ein Hash genau wie ein Array ist, also warum kann ich einen Hash nicht dazu bringen, einen anderen zu enthalten?

    
Mike 25.05.2010, 21:23
quelle

5 Antworten

6
  1. Sie sollten immer "use strict" verwenden. in Ihrem Programm.

  2. Verwenden Sie Referenzen und anonyme Hashes.

%Vor%

{%b} erstellt einen Verweis auf die Kopie von Hash %b . Sie müssen hier kopieren, weil Sie es später leeren.

    
Alexandr Ciornii 25.05.2010, 21:29
quelle
6

Hashes von Hashes sind schwierig, um das erste Mal richtig zu machen. In diesem Fall

%Vor%

bringt Sie dorthin, wo Sie hin wollen.

Siehe perldoc perllol für die Details zu zweidimensionalen Datenstrukturen in Perl.

    
mob 25.05.2010 21:29
quelle
4

Kurze Antwort: Hash-Schlüssel können nur mit einem Skalar verknüpft werden, nicht mit einem Hash. Um zu tun, was Sie wollen, müssen Sie Referenzen verwenden.

Anstatt die Datenstrukturen auf mehreren Ebenen neu zu hashen (heh), schlage ich vor, dass Sie perlreutut lesen. Perlref ist vollständiger, aber es ist auf den ersten Blick ein wenig überwältigend.

    
David Wall 25.05.2010 21:50
quelle
2

Mike, Alexandr ist die richtige Antwort.

Auch ein Tipp. Wenn Sie nur lernen Hashes Perl hat ein Modul namens Data :: Dumper, die Ihre Datenstrukturen für Sie hübsch drucken kann, das ist wirklich praktisch, wenn Sie überprüfen möchten, welche Werte Ihre Datenstrukturen haben.

%Vor%

Wenn Sie dies ausdrucken, wird

angezeigt %Vor%     
dalton 25.05.2010 21:44
quelle
1

Perl glättet gerne Ihre Datenstrukturen. Das ist oft eine gute Sache ... zum Beispiel endet (@options, "another option", "yet another") als eine Liste.

Wenn Sie wirklich eine Struktur innerhalb einer anderen haben wollen, muss die innere Struktur eine Referenz sein. Wie so:

%Vor%

Die geschweiften Klammern bezeichnen einen Hash, den Sie mit Werten aus% b füllen und den Sie als Referenz anstelle eines geraden Hashes erhalten.

Du könntest auch sagen

%Vor%

aber Änderungen an% b ändern auch $ a {1}.

    
cHao 25.05.2010 21:38
quelle

Tags und Links