Вы можете отсортировать вывод %columns
в своем коде с помощью
foreach my $i (sort { $a <=> $b } keys %columns) {
print join(" " => sort values %{ $columns{$i} }), "\n";
}
Это дает
A A A A
A A A C
A A B B
A A B D
Но с использованием индексов в качестве хеш-ключей screams что вы должны использовать вместо этого массив, так что давайте сделаем это.Чтобы получить столбцы, используйте
sub columns {
my @strings = @_;
my @columns;
while (@strings) {
push @columns => [ sort map s/^(.)//s ? $1 : (), @strings ];
@strings = grep length, @strings;
}
@columns;
}
Учитывая строки из вашего вопроса, он возвращает
A A A A
1 A A B
1 A B B
2 2 C D
1 1 3
2
Как видите, это не отсортировано и повторяет символы.В Perl, когда вы видите слово уникальное, всегда думайте о хешах!
sub unique_sorted_columns {
map { my %unique;
++$unique{$_} for @$_;
[ sort keys %unique ];
}
columns @_;
}
Если вы не против уничтожить информацию, вы можете columns
сортировать и фильтровать дубликаты:
sub columns {
my @strings = @_;
my @columns;
while (@strings) {
my %unique;
map { ++$unique{$1} if s/^(.)//s } @strings;
push @columns => [ sort keys %unique ];
@strings = grep length, @strings;
}
@columns;
}
Вывод:
A
1 A B
1 A B
2 C D
1 3
2