Schrift
[thread]7067[/thread]

hash in hash: ein hash in ein anderes füllen

Leser: 2


<< >> 6 Einträge, 1 Seite
dani
 2005-06-22 15:23
#55662 #55662
User since
2005-03-07
38 Artikel
BenutzerIn
[default_avatar]
Hallo!

habe n kleines Prblem mit meinem Hash...

ich lese ein file ein und lese Zeile für Zeile bis zu einem Punkt an dem ich wieder an einen Titel komme und lese wieder bis zum nächsten Titel (welcher immer gleich ist)
die Daten im Feld sind:

name = wert welche ich mit split an
$name resp. $value zuweise

ich schreibe nun das ganze in ein hash

Code: (dl )
$data{$name} = $value


soweit so gut, doch nun will ich das ein counter bei jedem Titel eins weiter geht und ein hash mit diesem counter soll nun den hash $data aufnehemen

im Stil von
Code: (dl )
$all{$counter} = $data


wieso geht das nicht, resp. was machen das es geht?
esskar
 2005-06-22 15:37
#55663 #55663
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du musst den hash als referenz speichern

Code: (dl )
$all{counter} = \%data; 


\%data ist dann quasi eine referenz (pointer) auf den eigentlichen hash
hier musst du auf passen

schlecht!
Code: (dl )
1
2
3
4
5
6
my %data = ();
while( ... ) {
if(...) {
$all{counter} = \%data;
}
}

da, %data immer der selbe hash ist, und somit die referenz auch immer die gleiche ist: so überschreibst du dir die daten, die zu dem record davor gehörten

VS.

gut!
Code: (dl )
1
2
3
4
5
6
while( ... ) {
my %data = ();
if(...) {
$all{counter} = \%data;
}
}
Taulmarill
 2005-06-22 16:54
#55664 #55664
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn man nur die werte in den hashkey füllen und nicht eine referenz auf einen echten hash erzeugen will, kann man sich mit einem anonymous hash behelfen:
Code: (dl )
1
2
3
4
5
6
my %hash = qw/foo bar baz bat/;
my $ref = { %hash };
$hash{foo} = 'foobar';

print Dumper $ref;
print Dumper \%hash;

so kann es einem nicht passieren, dass man die daten auf die die referenz verweist zufällig ändert, indem man mit dem original hash arbeitet.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
esskar
 2005-06-22 17:06
#55665 #55665
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
{ %hash } kopiert die werte in eine ref. das dauert etwas länger. kommt aber sowieso daruaf an, was man macht!
dani
 2005-06-22 17:41
#55666 #55666
User since
2005-03-07
38 Artikel
BenutzerIn
[default_avatar]
Danke vielmals für die Antworten.

Nur habe ich folgendes Problem:

\%data ist nur ein Pointer, und da ich %data beim nächsten durchlaufen von while wieder leer haben muss wird einfach der Pointer abgefüllt, nun will ich aber den Wert haben und muss dies nun Dereferenzieren!?

die heisst auch das %data ausserhalb der while schlaufe ist...
esskar
 2005-06-22 17:54
#55667 #55667
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=dani,22.06.2005, 15:41]Danke vielmals für die Antworten.

Nur habe ich folgendes Problem:

\%data ist nur ein Pointer, und da ich %data beim nächsten durchlaufen von while wieder leer haben muss wird einfach der Pointer abgefüllt, nun will ich aber den Wert haben und muss dies nun Dereferenzieren!?

die heisst auch das %data ausserhalb der while schlaufe ist...[/quote]
nö...
du kannst jetzt aus
Code: (dl )
$all{counter}->{foo}

zugreifen!
<< >> 6 Einträge, 1 Seite



View all threads created 2005-06-22 15:23.