use strict; #this basically disallows symblic ref use warnings; my %foo; $foo{bar} = "key bar's value"; #now you made $foo{bar} EXISTS, there is no need for auto-vivification to create it any more. MOST IMPORTANTLY, this can be a symblic reference depending on how you use it, continue... if(exists($foo{qux})) { print "\$foo{qux} exists"; } if(ref $foo{bar} eq 'HASH' && exists($foo{bar}{baz})) {#Here you are strongly suggesting a symblic reference. As for the code, the part before && obviously evaluate to false, so that exists after && will be evaluated, but no auto-vivfication here, as $foo{bar} exists any way print "\$foo{bar}{baz} exists\n";#will not print as there is no $foo{bar}{baz} } if(exists($foo{bar})) {#yes print "\$foo{bar} popped into existence\n";#print out, but not popped into existence, it is actually created by you } #the following is added by me $foo{bar}{baz} = 1; #violates strict refs, error, because you set $foo{bar} to a string earlier. There is no way to create $foo{bar}{baz} in this context, unless you turn off use strict("refs")