Hallo,
ich bin auf der Suche nach der Ursache für ein kleines aber fieses Perl-Problem. Die auf das Nötigste reduzierte Aufgabe besteht darin, Referenzen zu Listen in einem Hash abzuspeichern. Ich erzeuge also erstmal alle Strukturen:
%a = ();
@b = ('b'); @c = ('c');
$a{"x"} = @b; $a{"y"} = @c;
Der Wert zum Schlüssel x zeigt jetzt also auf eine Liste mit dem Element b, und der zum Schlüssel y auf eine Liste die c enthält.
Jetzt hole ich mir die Liste für den Schlüssel x und weise sie unverändert wieder zu:
@list = @{$a{"x"}}; $a{"x"} = @list;
Es hat sich nichts geändert, und so soll das auch sein. Jetzt probiere ich das mal mit y:
@list = @{$a{"y"}}; $a{"y"} = @list;
Und plötzlich zeigen sowohl x als auch y auf die Liste mit c. Welche irdische Erklärung kann es dafür geben?
Zum Anzeigen nehm ich folgende Routine:
foreach $key(keys(%a)){ print "Keys for $key:\n"; @list = @{$a{$key}}; foreach $value(@list){ print "* Value is $value\n"; } }
Josef Spillner
Josef Spillner (dr_maux@users.sourceforge.net) wrote:
Hallo Josef,
Und plötzlich zeigen sowohl x als auch y auf die Liste mit c. Welche irdische Erklärung kann es dafür geben?
naja, das ist klar: Du speicherst mit
@list = @{$a{"x"}};
die 'b'-Liste in @list. Mit
$a{"x"} = @list;
speicherst du eine Referenz auf @list in $a{"x"}. Na, fällt der Eurocent schon? $a{"x"} zeigt jetzt auf @list.
Nun lädst du die 'c'-Liste in @list und speicherst wieder eine Referenz auf @list, diesmal in $a{"y"}. $a{"x"} ist aber immer noch eine Referenz auf @list, und in @list ist ja inzwischen die 'c'-Liste.
Das ist zumindest meine Erklärung.
Andreas
lug-dd@mailman.schlittermann.de