use List::Util qw( max ); my @padded = do { my @copy = @path; my @segment_length; while( 1 ) { my $len = max map { s!([^/]*/|[^/]+)!! ? length( $1 ) : -1 } @copy; last if $len == -1; push @segment_length, $len; } my $format = join '', map "%${_}s", @segment_length; map {; no warnings 'uninitialized'; sprintf $format, split m!/!, $_, -1; } @path; }; @path = @path[ sort { $padded[ $a ] cmp $padded[ $b ] } 0 .. $#padded ];