sub somian_paths2tree { my $hr = {}; @{$hr}{@_} = map { {} } @_; my $n_repls; do { $n_repls=0; for ( map { $_->[0] } sort { $b->[1] <=> $a->[1] || length($b->[0]) <=> length($a->[0]) } map { [$_, 1 + (my@n =m{[\\]+}g)] } keys %$hr ) { if ( /(.*)\\(.*)/ ) { $hr->{$1}{$2} = delete $hr->{$_}; $n_repls++; } } } while ( $n_repls ); $hr }