Du kannst den Hash so leeren:
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:
$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:
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.