my $y = {}; my $x = { a => { b => { c => $y } } }; $y->{ d } = $x->{ a }; $y->{ e } = 1; #### package Bob; use Data::Dumper; use strict; use warnings; sub new { my $self = {visited=>{}}; bless($self); return $self; } sub list { my ($self, $data) = @_; my $pathes = {}; my $path = ""; list_slave($self->{visited},$data, $path, $pathes); return $pathes; } sub list_slave { my ($visited,$data, $path, $pathes) = @_; return if( exists $visited->{$data} ); $visited->{$data}++; if (ref($data) eq "HASH") { foreach my $key (keys(%$data)) { my $new_path = $path . '->{' . $key . '}'; if (ref($data->{$key})) { $pathes->{$new_path} = $data->{$key}; list_slave($visited,$data->{$key}, $new_path, $pathes); } else { $pathes->{$new_path} = \$data->{$key}; } } } elsif (ref($data) eq "ARRAY") { foreach my $index (0 .. $#{@$data}) { my $new_path = $path . '->[' . $index . ']'; if (ref($data->[$index])) { $pathes->{$new_path} = $data->[$index]; list_slave($visited,$data->[$index], $new_path, $pathes); } else { $pathes->{$new_path} = \$data->[$index]; } } } } ############ my $obj = new Bob(); my $y = {}; my $x = { a => { b => { c => $y } } }; $y->{ d } = $x->{ a };; $y->{ e } = 1++; print Dumper $y; print Dumper $obj->list($x);