Autovivificatie is het automatisch creëren van geneste structuren wanneer toegang wordt verkregen tot niet-bestaande delen van hash- of array-structuren. Als je toegang krijgt tot een niet-bestaand element, maakt Perl automatisch de tussenliggende elementen aan.
Bijvoorbeeld:
my %tree; $tree{ branch }{ leaf } = 'green'; # %tree bevat nu: { branch => { leaf => 'green' } }
Voordelen:
Nadelen:
Zal het volgende codefragment een structuur in de hash creëren? Waarom?
my %d; print exists $d{a}{b};
Antwoord: Ja, bij deze toegang vindt autovivificatie plaats: $d{a} zal automatisch een verwijzing naar een lege hash worden, zelfs als exists niets vindt.
Verhaal
In een project controleerden ze het bestaan van een pad in een complexe structuur:
if (exists $data{user}{profile}{email}) { ... }Zelfs als de structuren niet bestonden, leidde deze check tot het creëren van
$data{user}en$data{user}{profile}— de database vulde zich met "lege" elementen, waardoor de opslag vervuild raakte.
Verhaal
Bij het proberen door niet-bestaande knooppunten in een geneste hash te lopen, begonnen er volkomen onverwachte geneste hashes in de structuur te verschijnen. Dit bemoeilijkte het onderscheiden van het ontbreken van gegevens van standaardwaarden.
Verhaal
De ontwikkelaar hield rekening met geneste objecten via autovivificatie, zonder het proces te controleren. In de loop van de tijd groeide de structuur aan tot honderden lege tussenliggende elementen, wat de prestaties negatief beïnvloedde en debugging bemoeilijkte: het werd onduidelijk waar er daadwerkelijk gegevens waren en waar iets "op het moment zelf" was toegevoegd.