Autovivification — var olmayan hash veya array parçalarına erişirken iç içe yapıların otomatik olarak oluşturulmasıdır. Eğer var olmayan bir öğeye erişirseniz, Perl otomatik olarak ara öğeleri "oluşturur".
Örneğin:
my %tree; $tree{ branch }{ leaf } = 'green'; # %tree artık şunları içeriyor: { branch => { leaf => 'green' } }
Artılar:
Eksiler:
Aşağıdaki kod parçası bir hash'ta yapı oluşturacak mı? Neden?
my %d; print exists $d{a}{b};
Cevap: Evet, bu erişimle autovivification gerçekleşir: $d{a} otomatik olarak boş bir hash referansı haline gelir, hatta exists herhangi bir şey bulamıyorsa bile.
Hikaye
Bir projede karmaşık bir yapıda yolun varlığını kontrol ediyorduk:
if (exists $data{user}{profile}{email}) { ... }Yapı olmasa bile, bu kontrol
$data{user}ve$data{user}{profile}'in oluşturulmasına neden oluyordu — veritabanında "boş" öğeler oluşuyor, depolama alanını kirletiyordu.
Hikaye
İç içe bir hash'taki var olmayan düğümlere erişim denemesi yapıldığında, yapıda tamamen beklenmedik iç içe hash'ler oluşmaya başlıyordu. Bu, veri yokluğunu varsayılan değerlerden ayırt etmeyi zorlaştırıyordu.
Hikaye
Geliştirici, süreci denetlemeden autovivification ile iç içe nesnelerin kaydını aldı. Zamanla yapı, yüzlerce boş ara öğeye "büyüdü", bu da performansı olumsuz etkiledi ve hata ayıklamayı zorlaştırdı: gerçek verilerin nerede olduğunu ve "yolda" ortaya çıkanların nerede olduğunu anlamak imkânsız hale geldi.