traverse($in,0,0, sub {print ' ' x $_->{dept},'-',$_->{comm},"\n";}); sub traverse { my( $ref, $reply_to, $depth, $code) = @_; for my $node ( grep{ ($_->{dept} == $depth) && ($_->{r_to} == $reply_to) } @$ref ) { local $_ = $node; $code->(); traverse($ref, $node->{c_id}, ($depth + 1), $code); } }