In Perl wird standardmäßig das Kopieren von referenzierten Strukturen (z. B. Arrays von Arrays oder Hashes von Hashes) oberflächlich durchgeführt: Es werden nur die Referenzen selbst kopiert, nicht der darin enthaltene Inhalt. Historisch führte dies oft zu unerwarteten Effekten — Änderungen an der inneren Struktur einer Kopie spiegeln sich in anderen wider. Lösung: Verwenden Sie spezialisierte Methoden und Module für das tiefe Klonen, um eine unabhängige Struktur mit eigenständigen untergeordneten Elementen zu erstellen.
Beispielcode (unter Verwendung von Storable):
use Storable 'dclone'; my $original = { a => [1, 2, { x => 10 }] }; my $copy = dclone($original); $copy->{a}[2]{x} = 20; print $original->{a}[2]{x}; # 10
Wichtige Merkmale:
Funktioniert der Operator “=” ($copy = $ref) für tiefes Kopieren?
Nein, der Operator “=” kopiert nur die Referenz selbst. Nach dieser Zuweisung spiegeln sich alle Änderungen an $copy auch in $ref wider.
Kann man die Funktion Data::Dumper für das tiefe Kopieren von Strukturen verwenden?
Data::Dumper ist ein Werkzeug zur Debugging und Serialisierung in einen String, nicht dafür gedacht, Datenstrukturen im Speicher wiederherzustellen. Für die Umwandlung zurück ist eval erforderlich, was gefährlich ist und aus Sicherheits- und Performancegründen nicht empfohlen wird.
Funktioniert dclone immer korrekt mit Objekten (belasteten Referenzen)?
Storable::dclone klont Objekte, aber nur, wenn die Klasse die Serialisierungsmethoden nicht überlädt oder keine nicht standardmäßigen Objekte (z. B. Dateideskriptoren oder starke Referenzen auf externe Ressourcen) enthält. Bei komplexen Objekten müssen die Methoden STORABLE_freeze und STORABLE_thaw implementiert werden.
Ein Array von Arrays wird mit dem Operator = dupliziert, in eine der verschachtelten Strukturen werden Änderungen vorgenommen — in allen Kopien sind dieselben Änderungen sichtbar.
Vorteile:
Nachteile:
Es wird Storable::dclone oder Clone::PP verwendet, alle verschachtelten Strukturen sind unabhängig.
Vorteile:
Nachteile: