In Perl, beim Kopieren komplexer Datenstrukturen (z.B. Arrays von Arrays, Hashes von Hashes), ist es wichtig, den Unterschied zwischen "flachem Kopieren" (shallow copy) und "tiefem Kopieren" (deep copy) zu verstehen.
Flaches Kopieren erstellt einen neuen Container (z.B. ein Array oder einen Hash), aber die Elemente darin verweisen auf dieselben Objekte wie das Original. Dies kann zu unerwartetem Verhalten führen – Änderungen in der Kopie wirken sich auf das Original aus.
Tiefes Kopieren erstellt eine vollständig unabhängige Struktur, indem es rekursiv alle inneren Elemente kopiert. Für tiefes Kopieren wird in Perl häufig das Modul Storable oder [Clone] verwendet:
use Storable 'dclone'; my $original = { a => [1, 2, { b => 3 }] }; my $copy = $original; # Flache Kopie my $deep = dclone($original); # Tiefe Kopie $copy->{a}[2]{b} = 42; # Ändert sowohl $copy als auch $original! $deep->{a}[2]{b} = 99; # Ändert nur $deep
Tiefes Kopieren stellt sicher, dass die Strukturen vollständig isoliert sind.
Was ist der Unterschied zwischen dem Kopieren eines Arrays durch Zuweisung einer Variablen und dem Kopieren eines Arrays durch Referenz? Wie kopiert man ein Array korrekt, damit Änderungen in einem das andere nicht beeinflussen?
Es wird oft gesagt, dass es ausreicht, eine Referenz zuzuweisen: $copy = \@arr; — jedoch ist das falsch, da beide Variablen auf dasselbe Array verweisen. Für eine unabhängige Kopie verwendet man:
my @copy = @original; # Jetzt sind die Arrays unabhängig
Wenn verschachtelte Strukturen kopiert werden müssen – ist ein deep copy erforderlich, zum Beispiel über Storable::dclone.
Geschichte
Geschichte
Geschichte
Bei der Implementierung von E-Mail-Vorlagen für Massenmailings wurden die Ausgangsstrukturen mit verschachtelten Objekten durch Zuweisung kopiert, Änderungen im Text der Vorlage "sickerten" zwischen den Mailings durch, nicht aktuelle Nachrichten kamen bei den Empfängern an.