Autovivification — это автоматическое создание вложенных структур при обращении к несуществующим частям хэшей или массивов. Если вы обращаетесь к несуществующему элементу, Perl сам "создает" промежуточные элементы.
Например:
my %tree; $tree{ branch }{ leaf } = 'green'; # %tree теперь содержит: { branch => { leaf => 'green' } }
Плюсы:
Минусы:
Создаст ли следующий фрагмент кода структуру в хэше? Почему?
my %d; print exists $d{a}{b};
Ответ: Да, при таком обращении происходит autovivification: $d{a} автоматически станет ссылкой на пустой хэш, даже если exists ничего не находит.
История
На одном проекте проверяли наличие пути в сложной структуре:
if (exists $data{user}{profile}{email}) { ... }Даже если структуры не было, эта проверка приводила к созданию
$data{user}и$data{user}{profile}— в базе появлялись "пустые" элементы, засоряя хранилище.
История
При попытке пройтись по несуществующим узлам во вложенном хэше, в структуре начинали появляться совершенно неожиданные вложенные хэши. Это мешало отличать отсутствие данных от значений по умолчанию.
История
Разработчик завел учёт вложенных объектов через autovivification, не контролируя процесс. Со временем структура "разрослась" до сотен пустых промежуточных элементов, что негативно сказалось на производительности и усложнило отладку: стало неясно, где действительно есть данные, а где появилось "по ходу".