Array mit Assoziativem Array
Reinhard Doberstein
- perl
HAllo,
ich möchte ein Array anlegen dessen Elemente jeweils ein Assoziatives Array ist. Wie geht das, und wie kann ich das dann in einer Schleife wieder aulesen?
Was ich probiert habe:
my @allUsers;
my $user;
my %tst1 =("aaa" => "111",
"bbb" => "222");
push (@allUsers, %tst1);
%tst1 =("aaa" => "333",
"bbb" => "444");
push (@allUsers, %tst1);
foreach %user (@allUsers) { # Fehler 1
}
foreach $user (@allUsers) {
print $user ."\n"; # Position 2
}
bei "Fehler 1" kommt ein >>syntax error ... near "foreach %user"<<
bei Position 2 kommen einfach alle Werte, also "aaa", "111", "bbb" ... einfach hintereinander.
Wenn ich >>push (@allUsers, [%tst1]);<< benutze kommt an Position 2 ein >>ARRAY(0xe95440) << heraus. Kann ich damit was anfangen.
Leg ich das Array überhaup richtig an?
BY
Reinhard
Hallo Reinhard,
das Array ist in der Tat falsch angelegt.
Ein Array in Perl ist grundsätzlich ein Array des Datentyps Scalar. Deswegen kann auch kein Array-Element ein (assoziatives) Array sein. Du löst das Problem, indem Du Referenzen auf den Hash erstellst, da Referenzen Skalare sind:
my @allUsers;
my $user;
my %tst1=("aaa" => "111", "bbb" => "222");
push(@allUsers, %tst1);
%tst1=("aaa" => "333", "bbb" => "444");
push(@allUsers, %tst1);
foreach $user (@allUsers) {
print $user->{aaa}.'; '.$user->{bbb}."\n";
while (($k, $v)=each(%{$user})) {
printf "$k = $v\n";
}
}
Gruß,
Halt, da ist mir glatt ein kleiner Fehler unterlaufen :-)
Beide Arrayelemente zeigen nun auf den selben Hash, der logischer Weise immer die selben Daten beinhaltet.
Deswegen musst Du natürlich anonyme Hashes verwenden, d.h.
my @allUsers;
my $user;
$index=scalar(@allUsers);
$allUsers[$index]->{aaa}="111";
$allUsers[$index]->{bbb}="222";
$index=scalar(@allUsers);
my %tst1=("aaa" => "333", "bbb" => "444");
%{$allUsers[$index]}=%tst1;
foreach $user (@allUsers) {
while (($k, $v)=each(%{$user})) {
printf "$k = $v\n";
}
}
So nun hab ichs auch noch mal getestet und es läuft.
HAllo,
$index=scalar(@allUsers);
my %tst1=("aaa" => "333", "bbb" => "444");
%{$allUsers[$index]}=%tst1;
[...]
So nun hab ichs auch noch mal getestet und es läuft.
Danke, so geht. Wirklich verstehen tu ichs nicht, aber das Wissen eigne ich mir mal an wenn ich Zeit habe.
By
Reinhard
HAllo,
das Array ist in der Tat falsch angelegt.
Ein Array in Perl ist grundsätzlich ein Array des Datentyps Scalar. Deswegen kann auch kein Array-Element ein (assoziatives) Array sein. Du löst das Problem, indem Du Referenzen auf den Hash erstellst, da Referenzen Skalare sind:
my @allUsers;
my $user;my %tst1=("aaa" => "111", "bbb" => "222");
push(@allUsers, %tst1);
%tst1=("aaa" => "333", "bbb" => "444");
push(@allUsers, %tst1);foreach $user (@allUsers) {
print $user->{aaa}.'; '.$user->{bbb}."\n";while (($k, $v)=each(%{$user})) {
printf "$k = $v\n";
}
}
Danke erstmal, das bringt mich schon etwas weiter. Es kommt aber noch nicht das korrekte Ergebnis. Bei beiden push's wird ja die Adresse von %tst1 gespeichert. D.h. beim Ausgeben kommt 333;444 + 333;444. Eben zweimal das was in %tst1 steht.
Tatsächlih wird %tst1 in einer Subroutine gefüllt, ich weiss nicht wieviele Einträge existieren, und wieviele Infopaare da jeweils drin sind. Ich müsste also jedesmal Platz für %tst1 schaffen, und spätestens wenn das Programm fertig ist diesen wieder freigeben. Also wie mit malloc() und free() in C. Sieht recht umständlich aus, wenn das überhaupt geht.
By
Reinhard
HAllo,
ich möchte ein Array anlegen dessen Elemente jeweils ein Assoziatives Array ist. Wie geht das, und wie kann ich das dann in einer Schleife wieder aulesen?
Was ich probiert habe:
my @allUsers;
my $user;my %tst1 =("aaa" => "111",
"bbb" => "222");
push (@allUsers, %tst1);%tst1 =("aaa" => "333",
"bbb" => "444");
push (@allUsers, %tst1);foreach %user (@allUsers) { # Fehler 1
}
foreach $user (@allUsers) {
print $user ."\n"; # Position 2
}
Damit erzeugst du ein grosses Array, aber kein HASH.
So wie es aussieht willst du 2 HAHSes zusammenfügen.
Du kannst theoretisch mit:
my %user = @allUsers;
ein Array erzeugen, in deinem Beispiel gehen dadurch aber Einträge verloren.
Die Frage ist, was willst du genau machen?
Struppi.