Hash / Array Problem
Bernd
- perl
0 Helmut Weber0 Bernd
Hallo,
ich habe ein Perl-Problem. Hier estmal der Code:
#!/usr/bin/perl -w
use strict;
my %yy;
my %xx = (x => 5, y => 10);
my @test = ("1","ff",223,"asfd","sg");
$test[1] = {%xx};
%yy = $test[1];
So, jetzt das Problem. ICh will, dass in %xx und %yy identisch sind. Das sind sie aber nicht!! Ich kann mit $test[1] auf den Hash zugreifen, z.B. print $test[1]{x};. Es kommt auch noch folgende Fehlermeldung: "Reference found where even-sized list expected at test.pl line 10."
Woran kann das liegen??
mfg
Bernd
Hallo Bernd,
#!/usr/bin/perl -w
use strict;my %yy;
my %xx = (x => 5, y => 10);
my @test = ("1","ff",223,"asfd","sg");$test[1] = {%xx};
%yy = $test[1];
von Natur aus, kann ein Array nur Skalare Werte speichern. Wenn Du ein Hash in ein Array ablegen möchtest, musst Du dies über Referenzen tun!
Dazu solltest Du dir in deinen Perl-Handbüchern ein wenig das Thema "Referenzen" zur Brust nehmen!
Ich bin mit Referenzen zwar auch nicht so fit, würde aber folgendes Vorschlagen:
Eine Referenz auf ein Hash legst Du wie folgt an:
my $has_ref = %hash;
Analog zu deinem Beispiel:
$test[1] = %xx;
Eine Hash-Referenz kannst Du wieder wie folgt dereferenzieren:
my %hash = %$hash_ref;
Wieder zu deinem Beispiel:
my %yy = %$test[1];
Spiel einfach mal ein bischen mit Referenzen herum, Getestet habe ich die obigen Beispiele nicht, aber eine ungefähre Richtung für deine Lösung sollten sie schon geben.
Gruß
Helmut Weber
Hallo Helmut,
danke für deine Antwort. Du hast mich auf den richtigen Weg gebracht.
"%yy = %$test[1]" funktioniert zwar nicht, aber mit %yy = %{$test[1]} funktioniert es.
Mit "$test[1] = {%yy}" erzeuge ich automatisch eine Referenz auf eine Kopie von %yy. (das glaub ich zumindest, und bei eckigen Klammern mit Arrays ist es so) Und mit "%{$test[1]}" dereferenziere ich dann die Referenz wieder.
mfg
Bernd