Почему не работает сортировка массива Perl? - PullRequest
1 голос
/ 12 мая 2010

Почему массив не сортируется?

код

my @data = ('PJ RER Apts to Share|PROVIDENCE',  
'PJ RER Apts to Share|JOHNSTON',  
'PJ RER Apts to Share|JOHNSTON',  
'PJ RER Apts to Share|JOHNSTON',  
'PJ RER Condo|WEST WARWICK',  
'PJ RER Condo|WARWICK');  

foreach my $line (@data) {  
    $count = @data;  
    chomp($line);  
    @fields = split(/\|/,$line);  
    if ($fields[0] eq "PJ RER Apts to Share"){  
    @city = "\u\L$fields[1]";  
    @city_sort = sort (@city);  
    print "@city_sort","\n";  
    }  
}  
print "$count","\n";  

OUTPUT

Провиденс
Джонстон
Джонстон
Джонстон
6

Ответы [ 3 ]

6 голосов
/ 12 мая 2010
@city = "\u\L$fields[1]";  
@city_sort = sort (@city);  

Первая строка создает список с именем @city, который имеет один элемент. Вторая строка сортирует список (в котором есть один элемент). В этой программе не происходит никакой реальной сортировки.

Если я угадаю, что вы пытаетесь сделать, вам нужно что-то более похожее на

my @city = ();
my $count = @data;
foreach my $line (@data) {
    @fields = split /\|/, $line;
    if ($fields[0] eq "PJ RER Apts to Share") {
        push @city, "\u\L$fields[1]";
    }
}
@city_sort = sort @city;
print @city_sort, "\n", $count, "\n";

Собирает список @city в цикл и выполняет операцию сортировки вне цикла.

0 голосов
/ 12 мая 2010

«Не работает» заставляет нас читать ваши мысли и угадывать, что может сработать. В следующий раз, пожалуйста, опишите проблему с точки зрения вашего ожидаемого или желаемого поведения.

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

Я бы написал так:

my %aptcities;
foreach my $rec (@data) {
  my($type,$city) = split /\|/, $rec;

  next unless $type eq "PJ RER Apts to Share";

  $city =~ s/(\w+)/\u\L$1/g;  # handle WEST WARWICK, for example
  ++$aptcities{$city};
}

my $n = scalar keys %aptcities;
my $ies = $n == 1 ? "y" : "ies";
print "$n cit$ies:\n",
      map "  - $_\n", sort keys %aptcities;

Выход:

2 cities:
  - Johnston
  - Providence
0 голосов
/ 12 мая 2010
my @data = ('PJ RER Apts to Share|PROVIDENCE',  
    'PJ RER Apts to Share|JOHNSTON',  
    'PJ RER Apts to Share|JOHNSTON',  
    'PJ RER Apts to Share|JOHNSTON',  
    'PJ RER Condo|WEST WARWICK',  
    'PJ RER Condo|WARWICK');  

foreach my $line (@data) {   
    chomp($line);  
    @fields = split(/\|/,$line);  
    if ($fields[0] eq "PJ RER Apts to Share"){  
        push @city, "\u\L$fields[1]";  
    }  
} 

@city_sort = sort (@city);  
print map {"$_\n";} @city_sort;    
$count = @city_sort; 
print "$count","\n"; 

Я сделал $ count на @city_sort, потому что вы включили установку $ count в цикл, что подразумевает (для меня), что вы следите за количеством доступных квартир, а не за количеством объявлений. Просто измените его обратно на @data, если я ошибаюсь.

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