Thread funktion und referenz (15 answers)
Opened by shaihulud at 2006-05-24 18:26

Dubu
 2006-05-25 13:38
#66585 #66585
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
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
2
3
4
5
6
for (...) {
   my %hash;
   # fülle %hash mit Daten
   # ...
   $grosse_datenstruktur{$foo}{$bar} = \%hash;
}

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.

View full thread funktion und referenz