use Storable qw/dclone/; my $data = { test => { foo => { bar => 'bar', baz => 'baz', bul => { foo => { bar => 'bul' } } }, bar => { baz => 'baz' }, }, foo => { bar => 'foo' }, bar => [1,2,{foo => {bar => 42}},3] }; my @result = rec_data('->{foo}->{bar}',$data); print join(':',@result),"\n"; sub rec_data { my $path = shift; my $data = shift; my $ref = ref $data || return; my @vals = $ref eq 'HASH' ? values %$data : @$data; my $cdat = dclone($data); return (eval"\$cdat$path" || (),map{rec_data($path,$_)}@vals) }