in reply to quick question about hash element access

Sorry, basically you have to do it recursively or using eval. For a miniscule efficiency gain you can use tail-optimization to turn the recursion into iteration like so:
sub nested_lookup { my $node = shift; while (ref($node) and @_) { $node = $node->{ shift(@_) }; } return @_ ? undef : $node; }
and you would call it like this:
my $elem = nested_lookup(\%hash, split /\./, 'a.b.c.d');
(Note: could benefit from more error checking.)

Replies are listed 'Best First'.
Re: Re: quick question about hash element access
by Chmrr (Vicar) on Jun 28, 2003 at 01:11 UTC

    And with very few changes you can make it an lvalue, so you can use it to assign to:

    sub nested : lvalue { @_ == 1 ? $_[0] : nested($_[0]{$_[1]}, @_[2..$#_]); }

    ..and now you can say:

    nested(\%hash, a => b => c =>) = "VALUE";

    TThis can lead to such fun looking constructs as nested $hashref, a => b => c => d => = 42; Note that this code will only work under perl 5.6.0 or later, though; earlier perls had more restricted definitions of lvalues. See also descending a tree of hash references.

    perl -pe '"I lo*`+$^X$\"$]!$/"=~m%(.*)%s;$_=$1;y^`+*^e v^#$&V"+@( NO CARRIER'