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を通じて入れ子のオブジェクトの記録を開始しましたが、プロセスを制御していませんでした。時間が経つにつれて、構造は数百の空の中間要素まで「成長」し、パフォーマンスに悪影響を及ぼし、デバッグが複雑になりました: 実際にデータが存在する場所と、「途中で」出現した場所が不明になりました。