Thread funktion und referenz
(15 answers)
Opened by shaihulud at 2006-05-24 18:26
Du kannst den Hash so leeren:
Code: (dl
)
%hash = (); aber das wird evtl. dein Problem nicht lösen, denn ich nehme an, du möchtest dabei nicht gleichzeitig den Inhalt von $hash2->{$old_doc} auch löschen. $hash2->{$old_doc} enthält aber keine Kopie von %hash, sondern eine Referenz auf %hash, d.h. alle Änderungen an %hash ändern auch $hash2->{$old_doc}. Es gibt zwei Möglichkeiten, das zu umgehen: Erstens kann man den Hash bei der Zuweisung einfach kopieren. Das geht so: Code: (dl
)
$hash2->{$old_doc}={ %hash }; Hier wird rechts durch die geschwungenen Klammern eine Referenz auf einen anonymen Hash geschaffen, der mit dem Inhalt von %hash gefüllt wird. Die zweite Möglichkeit ist, %hash nur in einem kleinen Scope zu deklarieren, sodass er automatisch jedesmal neu angelegt wird. Das benutzt man oft mit Schleifen: Code: (dl
)
1 for (...) { Dadurch, dass %hash in der Schleife deklariert ist, wird er bei jedem Schleifendurchgang neu angelegt. Weil der "alte" Inhalt aber irgendwo in $grosse_datenstruktur noch referenziert wird, wird er nicht freigegeben. Statt einer Schleife kann hier genauso eine Subroutine stehen, die lokal %hash deklariert und die Referenz irgendeiner anderen Datenstruktur zuweist. |