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跟踪嵌套对象,没有控制过程。随着时间的推移,结构"膨胀"到数百个空中间元素,导致性能下降并使调试变得复杂:变得不清楚哪里真的有数据,哪里是"随之而来"的。