http://qs321.pair.com?node_id=703053


in reply to checking if hashref value exists based on a dynamic array

sub deep_exists { my $hash = shift; return 0 if @_ == 0; while (@_ > 1) { $hash = $hash->{shift} or return 0; } return exists $hash->{$_[0]}; } if (deep_exists(\%hash, 'a', 't', 'etc')) { ... }

Replies are listed 'Best First'.
Re^2: checking if hashref value exists based on a dynamic array
by kyle (Abbot) on Aug 08, 2008 at 15:15 UTC

    Did you try this? Generally, "$hash->{shift}" is interpreted as "$hash->{'shift'}", but I think you mean "$hash->{shift()}".

    Also, this and other solutions I've seen here seem to ignore the possibility of running into a non-hash somewhere along the way.

    use Test::More 'tests' => 5; sub deep_exists { my $hash = shift; my $key = shift; return 0 if ( ref $hash ne ref {} || ! exists $hash->{$key} ); return deep_exists( $hash->{$key}, @_ ) if @_; return 1; } my %h; $h{there}{also}{yes} = 1; $h{hash}{shift}{scalar} = 1; ok( deep_exists( \%h, 'there', 'also', 'yes' ), 'there also yes' ); ok( deep_exists( \%h, 'there', 'also' ), 'there also' ); ok( ! deep_exists( \%h, 'there', 'also', 'no' ), 'there also no' ); ok( deep_exists( \%h, 'hash', 'shift', 'scalar' ), 'hash shift scalar' + ); ok( ! deep_exists( \%h, 'hash', 'shift', 'scalar', 'hash' ), 'hash shift scalar hash' );

      Also, this and other solutions I've seen here seem to ignore the possibility of running into a non-hash somewhere along the way

      Mine (Data::Diver) checks.