[quote=weismat,26.05.2007, 17:05]Betterworld hat wohl den Nagel auf dem Kopf getroffen.
Ich benutze sehr viele tiefgeschachtelte Referenzen auf Hashes, die mehrere Ebenen tief sind.[/quote]
Tief und verschachtelt ist kein Problem, sondern zyklisch. Das bedeutet praktisch, dass irgendwo in einer Struktur eine Referenz auf den Anfang der Struktur gespeichert ist, wie in den folgenden Beispielen:
# Einfacher Hash
my $foo; $foo = {foo=>\$foo};
# Komplizierterer Hash
my $bar = {
blubb => {}
};
$bar->{blubb}{ding}{dang} = \$bar->{blubb};
# Closure (besonders trickreich)
my ($sub1, $sub2);
$sub1 = sub {sub2->();};
$sub2 = sub {sub1->();};
Wenn Du an einem bestimmten Punkt weisst, dass Du eine Struktur nicht mehr brauchst, kannst Du versuchen, den Kreis zu brechen, damit der Garbage Collector den Rest machen kann. (Das ist bei Closures allerdings oft nicht moeglich.)
Ansonsten hilft weaken() aus Scalar::Util. Wenn man das verwendet, sollte man aber gut testen, ob es wirklich funktioniert, denn meiner Erfahrung nach verhaelt es sich manchmal seltsam.
Eine dritte Moeglichkeit, von der ich mal gelesen habe, sind Proxy-Objekte. Das ist allerdings ziemlich obskur und ich habe es auch noch nie eingesetzt.
DESTROY ist hier uebrigens zum Debuggen hilfreich.\n\n
<!--EDIT|betterworld|1180198605-->