2010-07-19 5 views
1

У меня есть массив, который выглядит следующим образом:Сортировать Perl числовой массив

array[0]: 6 8 
array[1]: 12 9 6 
array[2]: 33 32 5 
array[3]: 8 6 

Я хочу, чтобы отсортировать этот массив, так что это выглядит следующим образом:

array[0]: 6 8 
array[1]: 6 9 12 
array[2]: 5 32 33 
array[3]: 6 8 

Я знаю, что я могу сортировать массив с @newarray = sort {$a cmp $b} @array;, но мне нужно отсортировать элементы в каждой строке. Как я могу это сделать?

+3

- это массив массивов или строки? –

+0

это строки – user366121

ответ

6

Если предположить, что у вас есть массив строк там, и все, что вы хотите, чтобы отсортировать каждую строку, как если бы он был суб-массив чисел (но оставить его строку?):

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @array = ('6 8', '12 9 6', '33 32 5', '8 6'); 

foreach my $string (@array) { 
    $string = split_sort($string); 
} 

sub split_sort { 
    my $string = shift @_; 
    my @internal_nums = split ' ', $string; 
    @internal_nums = sort {$a <=> $b} @internal_nums; 
    return join ' ', @internal_nums; 
} 

print "@array\n"; 
+0

thx. кто это сделал. – user366121

5

У вас есть список предметов, которые вы хотите преобразовать. Это идеальный кандидат для map. Также обратите внимание на поведение по умолчанию split: он работает на $_, разделяя пробелы, удаляя начальные пробелы.

my @array = ('6 8', '12 9 6', '33 32 5', '8 6'); 
@array = map { join ' ', sort {$a <=> $b} split } @array; 
5

Вы также могли бы решить эту проблему через карту

#!/usr/bin/env perl 


my @numbers = (
    '6 8', 
    '12 9 6', 
    '33 32 5', 
    '8 6', 
); 

my @sorted; 
push (@sorted, map { join " ", sort { $a <=> $b } (split//, $_) } @numbers); 


print "$_\n" for @sorted; 

выходы:

6 8 
6 9 12 
5 32 33 
6 8 
+0

+1 для решения, которое намного короче, легче понять и более эффективно, чем цикл foreach с вызовом подпрограммы на каждой итерации. – Jonas

+1

+1 по тем же причинам, хотя он может быть значительно сокращен: 'map {join" ", sort split} @ numbers' должен работать. –

+1

@ Jon На самом деле, нет, это не сработает. Вам по-прежнему нужен числовой вид - 'map {join '", sort {$ a <=> $ b} split} @ numbers'. – Telemachus

Смежные вопросы