my (@list,$flat); flatten($_,$thingy{$_}) foreach keys %thingy; sub flatten { my ($key,$rest) = @_; unless ($rest) { push @list,$flat; undef $flat; return; } $flat .= "$key/"; flatten(%$rest); } print Dumper \@list;