Сортировка массива не удалась в Perl - PullRequest
0 голосов
/ 29 декабря 2010

Я тренировался вставлять элементы в массив и сортировать их, а затем распечатывать список членов.

use strict;
use warnings;
use Data::Dumper;

my $fh = \*DATA;


while(my $line = <$fh>) {



        chomp($line);
        $line =~ s/\s+//g;

        push(my @ArrLines, $line);

        my @SortedArr = sort @ArrLines;

        foreach my $val (@SortedArr) {

                print "$val\n";
        }
}

__DATA__
A2B12,A8B15
A3B27
A5B14,A8B15,A5B18

Я надеюсь, что вывод, как показано ниже, но я обнаружил, что он не работает.

A2B12
A3B27
A5B14    
A5B18
A8B15

Примечание: остался только один дублированный элемент, например A8B15.

Благодарим за ваши комментарии и предложения.

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

Сортировка после чтения, не сортировка в середине.

push(my @ArrLines каждый раз создает новые @ArrLines.Объявите это вне цикла.

Вы нигде не разделяете запятую, но, похоже, это необходимо.

Самый простой способ дедупликации - использовать хеш вместо массива.*

Итак:

use strict;
use warnings;
use Data::Dumper;

my $fh = \*DATA;

my %lines;
while (my $line = <$fh>) {
    chomp($line);
    $lines{$_}++ for split /,/, $line;
}

my @sorted_array = sort keys %lines;
print Dumper \@sorted_array;
1 голос
/ 29 декабря 2010

Есть несколько проблем:

  1. Вам необходимо объявить my @ArrLines; над циклом, который читает строки.В настоящее время он повторно объявляется (и, следовательно, устанавливается как пустой) после чтения каждой строки.

  2. Вам необходимо выполнить сортировку и вывести после цикла, который читает строки.

Также вы не разделяете ввод на запятые, и, судя по вашему "ожидаемому выводу", вы должны быть.Для этого вы можете использовать функцию split().

Кроме того, вы упоминаете, что хотите, чтобы дублирующиеся элементы появлялись только один раз, но вы ничего не делаете для этого.После сортировки элементов достаточно проверить, совпадает ли текущий элемент с предыдущим, и распечатать его только в том случае, если это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...