Schrift
[thread]5851[/thread]

Hash in einem Hash mit variablen Keys



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Gast Gast
 2003-10-23 22:02
#67029 #67029
Irgendwas mach ich falsch, ich hab schon tausend Sachen ausprobiert. Ich will innerhalb eines Hashes immer wieder neue Keys anlegen, eine Variable die einen namen enthält soll der Key sein. Diesem Key möchte ich als Hashpaar einen anderen Hash zuordenen der vorher mit Datenpaaren gefüllt wird. Es scheint auch alles zu klappen, jedoch kann ich das ganze nicht mehr auslesen. Hier mein Codebeispiel:

#Init Äusserer Hash
%provinces = (
);

#Init Innerer Hash
%provincecontent = (
   name => 0,
   bossmakers => 0,
);


while (<FH1>) {

#für jeden durchlauf einen neuen key einlesen
$key = getKey();

#Füllen des inneren Hashes
$provincecontent {'name'} = $key;
$provincecontent {'bossmakers'} = 1200;

#zuweisen mit dem namen als key
$provinces {$key} = %provincecontent;

#alternative
#$provinces {$key} = $provincecontent;



#nun versuche ich das ganze wieder auszulesen (das ist ein variante die ich im forum gefunden habe, ich hab das selbe auch noch erfolglos mit ($testkey, #$testvalue) = each %provinces) probiert ... und noch einige andere varianten)

foreach my $key (keys %provinces)
{  
   print $key; #hier werden die richtigen namen ausgegeben
   foreach my $subkey (keys %{$provinces{$key}})
   {
       print $subkey; #hier komme ich erst gar nicht hin
       print "test";
       print "$key => $subkey : " . $provinces{$key}{$subkey} . " ";
   }
}



wenn mir jemand weiterhelfen könnte ... danke!
betterworld
 2003-10-23 23:06
#67030 #67030
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=Guest,23.10.2003, 20:02]$provinces {$key} = %provincecontent;[/quote]
So etwas geht in Perl nicht. Hashes koennen immer nur Skalare enthalten. Du kannst aber Folgendes tun:
Code: (dl )
$provinces{$key} = \%provincecontent;

Auslesen geht dann so:
Code: (dl )
my $value = $provinces{$key}{$nocheinkey}


Warum das klappt, erfaehrst Du, wenn Du Dich mal etwas ueber Referenzen in Perl informierst.

Edit: Die Keys bekommst Du uebriens so:
Code: (dl )
@keys = keys %{$provinces{$key}};
\n\n

<!--EDIT|betterworld|1066936057-->
DS
 2003-10-23 23:28
#67031 #67031
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,23.10.2003, 21:06][quote=Guest,23.10.2003, 20:02]$provinces {$key} = %provincecontent;[/quote]
So etwas geht in Perl nicht. Hashes koennen immer nur Skalare enthalten.[/quote]
So etwas geht in Perl noch nicht.
oder
So etwas geht in Perl 5 nicht.

(In Perl 6 gibt ein Hash in skalarem Kontext erst mal eine Referenz auf sich selbst zurück. *löschlöschlösch* Das reicht... ;))
havi
 2003-10-23 23:47
#67032 #67032
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Perl6 - ist das noch Perl ???
Crian
 2003-10-25 04:00
#67033 #67033
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Irgendwann wird man sich fragen, wie man all die Sachen in dem "alten" Perl 5 bloss gemacht hat ^^
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
merl
 2003-10-29 17:35
#67034 #67034
User since
2003-10-29
1 Artikel
BenutzerIn
[default_avatar]
danke schon mal, ich denke nun bin ich schon ein ganzes stück weiter. bin nun auf ein anderes problem gestossen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
%provinces = (
);

$i = 1;


%provincecontent1 = (
name => 0,
troops => 888,
);

$provinces{test1} = \%provincecontent1;

%provincecontent1 = (
name => 1,
troops => 999,
);

$provinces{test2} = \%provincecontent1;

my $value = $provinces{test1}{name};
print $value;
my $value = $provinces{test1}{troops};
print $value;
my $value = $provinces{test2}{name};
print $value;
my $value = $provinces{test2}{troops};
print $value;


nun ist das problem, dass ich nur eine referenz habe, und diese natürlich bei der 2ten zuweisung einen anderen wert annimmt.

die ausgabe jetzt ist 1,999 und 1,999
sie sollte aber 0,888 und 1,999 sein.


danke schonmal.
betterworld
 2003-10-29 18:08
#67035 #67035
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Pfui, das klingt ja nach Krieg!

Wenn Du jedes Mal eine neue Referenz erzeugen willst, schreibe:
Code (perl): (dl )
{%hash} statt \%hash;
\n\n

<!--EDIT|betterworld|1067443829-->
kabel
 2003-10-29 18:38
#67036 #67036
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
[SCNR]
leider bleibt die ausgabe die selbe
preisfrage: warum?
[/SCNR]
-- stefan
betterworld
 2003-10-29 18:42
#67037 #67037
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
@kabel: bei mir nicht. Wenn ich
Code: (dl )
$provinces{test1} = \%provincecontent1;

in
Code: (dl )
$provinces{test1} = {%provincecontent1};

aendere, wird das erste mal 0888 ausgegeben.
kabel
 2003-10-29 18:47
#67038 #67038
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
.oO ich nehme alles zurück (sogar die preisfrage) und entschuldige mich. :wallbash:
-- stefan
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2003-10-23 22:02.