Autovivification to automatyczne tworzenie zagnieżdżonych struktur przy odwoływaniu się do nieistniejących części haseł lub tablic. Jeśli odwołasz się do nieistniejącego elementu, Perl sam "tworzy" elementy pośrednie.
Na przykład:
my %tree; $tree{ branch }{ leaf } = 'green'; # %tree teraz zawiera: { branch => { leaf => 'green' } }
Zalety:
Wady:
Czy następujący fragment kodu stworzy strukturę w hashu? Dlaczego?
my %d; print exists $d{a}{b};
Odpowiedź: Tak, przy takim odwołaniu zachodzi autovivification: $d{a} automatycznie stanie się referencją do pustego hasha, nawet jeśli exists nic nie znajdzie.
Historia
W jednym projekcie sprawdzano istnienie ścieżki w złożonej strukturze:
if (exists $data{user}{profile}{email}) { ... }Nawet jeśli struktury nie było, ta kontrola prowadziła do stworzenia
$data{user}i$data{user}{profile}— w bazie pojawiały się "puste" elementy, zanieczyszczając przechowalnię.
Historia
Przy próbie przejścia przez nieistniejące węzły w zagnieżdżonym hashu, w strukturze zaczynały pojawiać się całkowicie nieoczekiwane zagnieżdżone hashe. Utrudniało to odróżnienie braku danych od wartości domyślnych.
Historia
Programista zarządzał ewidencją zagnieżdżonych obiektów przez autovivification, nie kontrolując procesu. Z biegiem czasu struktura "rozrosła się" do setek pustych elementów pośrednich, co negatywnie wpłynęło na wydajność i skomplikowało debugowanie: stało się niejasne, gdzie naprawdę są dane, a gdzie pojawiły się "na bieżąco".