Last time I spoke about wrapping hash access I got a bit more than I bargained for. It’s still something I’m tempted to do from time to time.

Autovivification by default is very sensible (or perhaps Perl just suits me). When I set a parameter within a structure, I generally want all the ancestors to be created first. That’s why I have the following aliases to mkdir .

jared@localhost $ alias | grep mkdir alias failingmkdir='/bin/mkdir' alias mkdir='mkdir -p'

Autovivification on data retrieval though, can be a bit confusing.

use strict ; my $data = {}; print '1:' , exists ($data->{ 'key1' }), "

" ; if (! exists ($data->{ 'key1' }{ 'key2' })) { print '2:' , exists ($data->{ 'key1' }), "

" ; }

jared@localhost $ perl5.10 t.pl 1: 2:1

The CPAN Autovivification Module

Fortunately, it’s easy enough to disable it with the autovivification module.

no autovivification qw (strict fetch exists delete) ;

perl t.pl 1: Reference vivification forbidden at t.pl line 7.

Promote Uninitialized Warnings to Fatal

Zoul mentions a way to avoid typical autovivification errors on stackoverflow.

use warnings NONFATAL => 'all' , FATAL => 'uninitialized' ;

Or unlock_keys and lock_keys_plus from Hash::Util mentioned by Chas. Owens in the comments might be closer to what is needed in some circumstances.