use strict; use warnings; use 5.010; my %categories = ( level1 => { 'level1-1' => {}, 'level1-2' => {'level1-2-1' => {}}, 'level1-3' => {}, }, level2 => {'level2-1' => {}}, ); dumpHash(\%categories); sub dumpHash { my ($subHash, $indent) = @_; $indent //= ''; given (ref $subHash) { when ('') {print "$indent$subHash\n" if defined $subHash} when ('HASH') { for my $key (sort keys %$subHash) { print "$indent$key\n"; dumpHash($subHash->{$key}, "$indent "); } } } } #### level1 level1-1 level1-2 level1-2-1 level1-3 level2 level2-1