Here using Data::Walk, Data::Visitor::Callback
#!/usr/bin/perl --
use strict;
use warnings;
use Data::Dumper ();
Main( @ARGV );
exit( 0 );
sub Main {
my $root = {
'foo' => {
'child1' => {
'gchild1' => {
'values' => {
'bar1' => 1,
'bar2' => 1
}
}
},
'child2' => {
'gchild1' => {
'values' => {
'bar1' => 1,
'bar2' => 1
}
},
'gchild2' => {
'values' => {
'bar1' => 1,
'bar2' => 1
}
}
},
'child3' => {
'values' => {
'bar1' => 1,
'bar2' => 1
}
}
}
};
use Data::Visitor::Callback;
my $vorp = sub {
my @v;
my $v = Data::Visitor::Callback->new(
ignore_return_values => 1,
hash_entry => sub {
my ( $self, $k, $v ) = @_;
push @v, $v if $k eq 'values' and $v;
return;
},
);
$v->visit( @_ );
return @v;
};
print DD( $root, [ $vorp->( $root ) ], ), '#' x 33 , "\n";
use Data::Walk();
$vorp = sub {
my @v;
Data::Walk::walk( sub {
## same result as 2nd if block below
#~ no warnings 'uninitialized';
#~ if( 'HASH' eq $Data::Walk::type and ref $_){
#~ my $v = $_->{values};
#~ push @v, $v if $v;
#~ }
if( $_ eq 'values'){
push @v, $Data::Walk::container->{values};
}
return;
}, @_ );
return @v;
};
print DD( $root, [ $vorp->( $root ) ], ), '#' x 33 , "\n";
}
sub DD { scalar Data::Dumper->new( \@_ )->Indent(1)->Useqq(1)->Dump; }
__END__
$VAR1 = {
"foo" => {
"child2" => {
"gchild2" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
},
"gchild1" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
}
},
"child3" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
},
"child1" => {
"gchild1" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
}
}
}
};
$VAR2 = [
$VAR1->{"foo"}{"child2"}{"gchild2"}{"values"},
$VAR1->{"foo"}{"child2"}{"gchild1"}{"values"},
$VAR1->{"foo"}{"child3"}{"values"},
$VAR1->{"foo"}{"child1"}{"gchild1"}{"values"}
];
#################################
$VAR1 = {
"foo" => {
"child2" => {
"gchild2" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
},
"gchild1" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
}
},
"child3" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
},
"child1" => {
"gchild1" => {
"values" => {
"bar1" => 1,
"bar2" => 1
}
}
}
}
};
$VAR2 = [
$VAR1->{"foo"}{"child2"}{"gchild2"}{"values"},
$VAR1->{"foo"}{"child2"}{"gchild1"}{"values"},
$VAR1->{"foo"}{"child3"}{"values"},
$VAR1->{"foo"}{"child1"}{"gchild1"}{"values"}
];
#################################
Data::DPath might also be a candidate