use strict; use warnings; sub print_tree { my ($tree, $depth) = @_; $depth ||= 0; my $indent = '...' x $depth; for (sort keys %$tree) { print($indent, /^\s*\z/ ? "" : $_, "\n"); print_tree($tree->{$_}, $depth+1); } } my %categories = ( level1 => { 'level1-1' => {}, 'level1-2' => {'level1-2-1' => {}}, 'level1-3' => {}, }, level2 => {'level2-1' => {}}, ); print_tree(\%categories); #### level1 ...level1-1 ...level1-2 ......level1-2-1 ...level1-3 level2 ...level2-1