http://www.perlmonks.org?node_id=229912


in reply to Autovivification with hash of hashes

Yes you did do something with it. In order to check whether exists $foo{bar}{baz}, obviously, $foo{bar} must be a hash reference. Perl DWIMs (most of the time) by creating an empty hashref on multilevel lookup attempts, but sometimes, like in your case, that is undesired. What you have to do is clunky: check every level of the hierarchy yourself. Something like
my $cursor = \%foo; for(qw(foo bar)) { undef $cursor, last unless exists $cursor->{$_}; $cursor = $cursor->{$_}; } print "exists\n" if $cursor;
You want to put this in a function like
sub exists_novivify { my $cursor = shift; for(@_) { undef $cursor, last unless exists $cursor->{$_}; $cursor = $cursor->{$_}; } $cursor; } print "exists\n" if exists_novivify \%foo, qw(bar baz);
Update: removed duplicate exists. Thanks BrowserUk.

Makeshifts last the longest.

Replies are listed 'Best First'.
Re: Re: Autovivification with hash of hashes
by Mr_Person (Hermit) on Jan 26, 2003 at 01:50 UTC
    Thanks! That sorta makes sense, although it's still annoying. I guess that's the price you pay for Perl's flexibility.