In Perl wordt standaard het kopiëren van referentiedatastructuren (zoals arrays van arrays of hashes van hashes) oppervlakkig uitgevoerd: alleen de verwijzingen zelf worden gekopieerd, niet de geneste inhoud. Historisch gezien leidde dit vaak tot onverwachte effecten - wijzigingen in de interne structuur van één kopie worden weerspiegeld in andere. Oplossing: gebruik gespecialiseerde methoden en modules voor diep klonen om een autonome structuur te creëren met onafhankelijke geneste elementen.
Voorbeeld van code (met 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
Belangrijke kenmerken:
Werkt de operator '=' ($copy = $ref) voor diepe kopie?
Nee, de operator '=' kopieert alleen de verwijzing zelf. Na zo'n toewijzing zullen wijzigingen aan $copy ook in $ref zichtbaar zijn.
Kan de functie Data::Dumper worden gebruikt voor diepe kopie van een structuur?
Data::Dumper is een hulpmiddel voor debugging en serialisatie naar een string, en is niet bedoeld voor het herstellen van datastructuren in het geheugen. Voor de omgekeerde omzetting is eval nodig, wat gevaarlijk is en om veiligheids- en prestatie-redenen niet wordt aanbevolen.
Werkt dclone altijd correct met objecten (verheven referenties)?
Storable::dclone kloont objecten, maar alleen als de klasse de serialisatiemethoden niet overbelast of geen niet-standaardobjecten bevat (zoals bestandsdescriptoren of sterke verwijzingen naar externe middelen). Voor complexe objecten is het nodig om de methoden STORABLE_freeze en STORABLE_thaw te implementeren.
Een array van arrays wordt gedupliceerd met de operator '=', wijzigingen worden aangebracht in een van de geneste structuren - in alle kopieën zijn dezelfde wijzigingen zichtbaar.
Voordelen:
Nadelen:
Er wordt gebruik gemaakt van Storable::dclone of Clone::PP, alle geneste structuren zijn onafhankelijk.
Voordelen:
Nadelen: