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