(UNTESTED) sub tree_tuples { my( $tree, @names ) = @_; my $name = shift @names; map { my $k = $_; my $v = $tree->{$k}; ref $v ? map( +{ $name => $k, %$_ }, tree_tuples( $v, @names ) ) : { $name => $k, $names[0] => $v } } keys %$tree } # now use it with the OP's $hash hashref print "Count Section Item\n"; for ( sort { $b->{'count'} <=> $a->{'count'} or $a->{'section'} cmp $b->{'section'} or $a->{'item'} cmp $b->{'item'} } tree_tuples( $hash, qw( section item count ) ) ) { printf "%5d %7s %7s\n", @{$_}{qw( count section item )}; }