_create_node ('p1',"pp1","first"); _create_node ('pp1',"ppp1","second"); _create_node ('ppp1',"pppp1","third"); _create_node ('pppp1',"ppppp1","root"); my $infos = _go_through('p1'); print Dumper $infos; { my %nodes; sub _create_node { my ($node_id,$parent,$node_info) = @_; @{$nodes{$node_id}}{qw/parent info/} = ($parent,$node_info); } sub _go_through { my ($node_id) = @_; return "" unless defined ${$nodes{$node_id}}{"info"}; my @info_nodes; while (${$nodes{$node_id}}{"info"} ne "root"){ push @info_nodes, (${$nodes{$node_id}}{"info"}); $node_id = ${$nodes{$node_id}}{"parent"}; ## Line 33 } return \@info_nodes; } }