2010-07-19 6 views
1

J'ai un tableau qui ressemble à ceci:Trier Perl tableau numérique

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

Je veux trier ce tableau pour qu'il ressemble à ceci:

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

Je sais que je peux trier le tableau avec @newarray = sort {$a cmp $b} @array;, mais j'ai aussi besoin de trier les éléments dans chaque ligne. Comment puis je faire ça?

+3

est-ce un tableau de tableaux ou sont-ils des chaînes? –

+0

ce sont des chaînes – user366121

Répondre

6

En supposant que vous avez un tableau de chaînes là-bas, et que tout ce que vous voulez est de trier chaque chaîne comme si elle était un sous-tableau de nombres (mais laisser une chaîne?):

#!/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. ça l'a fait. – user366121

5

Vous avez une liste d'éléments que vous voulez transformer. C'est un candidat parfait pour map. Notez également le comportement par défaut de split: il fonctionne sur $_, en séparant les espaces, après avoir supprimé les espaces de début.

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

Vous pouvez également résoudre en utilisant la carte

#!/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; 

sorties:

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

+1 pour une solution beaucoup plus courte, plus facile à comprendre et plus efficace qu'une boucle foreach avec un appel de sous-programme à chaque itération. – Jonas

+1

+1 pour les mêmes raisons, bien qu'il puisse être considérablement raccourci: 'map {join" ", trier split} @ numbers' devrait fonctionner. –

+1

@Jon En fait, non, cela ne fonctionnera pas. Vous avez toujours besoin d'un tri numérique - 'map {join" ", sortez {$ a <=> $ b} split} @ numbers'. – Telemachus