In Perl, bij het kopiëren van complexe datastructuren (bijvoorbeeld arrays van arrays, hashes van hashes), is het belangrijk om het verschil tussen "oppervlakkige kopieën" (shallow copy) en "diepe kopieën" (deep copy) te begrijpen.
Oppervlakkige kopie creëert een nieuwe container (bijvoorbeeld een array of hash), maar de elementen daarin verwijzen naar dezelfde objecten als het origineel. Dit kan leiden tot onverwacht gedrag — wijzigingen in de kopie beïnvloeden het origineel.
Diepe kopie creëert een volledig onafhankelijke structuur, door alle geneste elementen recursief te kopiëren. Voor diepe kopieën wordt in Perl vaak de module Storable of [Clone] gebruikt:
use Storable 'dclone'; my $original = { a => [1, 2, { b => 3 }] }; my $copy = $original; # Oppervlakkige kopie my $deep = dclone($original); # Diepe kopie $copy->{a}[2]{b} = 42; # Verandert zowel $copy als $original! $deep->{a}[2]{b} = 99; # Verandert alleen $deep
Diepe kopieën garanderen dat structuren volledig van elkaar geïsoleerd zijn.
Wat is het verschil tussen het kopiëren van een array door middel van toewijzing aan een variabele en het kopiëren van een array door middel van een referentie? Hoe kopieer je een array goed zodat wijzigingen in de ene niet de andere beïnvloeden?
Vaak wordt er gezegd dat het voldoende is om een referentie toe te wijzen: $copy = \@arr; — echter is dit onjuist, omdat beide variabelen naar dezelfde array verwijzen. Voor onafhankelijke kopieën gebruik je:
my @copy = @original; # Nu zijn de arrays onafhankelijk
Als geneste structuren moeten worden gekopieerd — is een diepe kopie noodzakelijk, bijvoorbeeld via Storable::dclone.
Verhaal
Verhaal
Verhaal
Bij de implementatie van e-mail sjablonen voor massamailings kopieerden we de oorspronkelijke structuren met geneste objecten door middel van toewijzing, wat resulteerde in wijzigingen in de tekst van het sjabloon die "lekten" tussen de mailings, waardoor verouderde berichten bij de adressaten aankwamen.