sub traverse { my $t = shift; my $d = shift || 0; foreach my $k (sort keys %$t) { print ' ' x $depth, "$k\n"; traverse( $t->{$k}, $depth + 1 ); } } sub rebuild { my $sub; $sub = sub { my ($t) = @_; my $r = {}; while (my ($k, $v) = keys %$t) { while (keys %$v == 1) { my $k1 = (keys %$v)[0]; $k .= " $k1"; $v = $v->{$k1}; } $r->{$k} = $sub->($v); } $r; }; $sub->{$_[0]}; } traverse( $old_tree ); my $rebuilt = rebuild( $old_tree ); traverse( $rebuilt );