2010-08-26 3 views
19
print "@_\n"; 
4109 4121 6823 12967 12971 14003 20186 

Comment le trier en Perl?Comment trier les nombres en Perl?

En utilisant @sorted = sort(@_); me donne une commande alphabétique

13041 13045 14003 20186 4109 4121 6823 

Comment puis-je obtenir une commande numérique? Perl dispose-t-il de fonctions intégrées pour le tri par fusion, l'insertion-tri, etc.?

+0

BTW, connaissez-vous la commande perldoc? –

+0

@eugene y: non je n'ai pas. Je sais maintenant. Merci! – Lazer

Répondre

42

Vous pouvez transmettre une fonction de comparaison personnalisée à la routine de tri de Perl. Il suffit d'utiliser:

@sorted = sort { $a <=> $b } @unsorted; 

La fonction sort accepte une fonction de comparaison personnalisée comme premier argument, sous la forme d'un bloc de code. La partie {...} est juste ce bloc de code (voir http://perldoc.perl.org/functions/sort.html).

sort appellera cette fonction de comparaison personnalisée chaque fois qu'elle doit comparer deux éléments du tableau à trier. sort passe toujours dans les deux valeurs pour comparer $a, $b, et la fonction de comparaison doit retourner le résultat de la comparaison. Dans ce cas, il utilise simplement l'opérateur pour la comparaison numérique (voir http://perldoc.perl.org/perlop.html#Equality-Operators), qui a probablement été créé juste à cet effet :-).

Solution sans vergogne volé "Perl Cookbook", chapitre 04 Sous-chapitre 15 (acheter le livre - ça vaut le coup)

+1

Je prendrai ce lien, il distribue du matériel protégé par des droits d'auteur sans le consentement du titulaire. Vous pouvez recommander l'œuvre originale (le livre de recettes Perl, Christiansen et Torkington) à la place. –

+0

Il semble y avoir un consensus sur [Perl] tag que la liaison à des copies piratées de livres O'Reilly (ou des livres) est Bad. Modification pour supprimer – DVK

+0

Désolé, je ne savais pas que le lien était à un matériel piraté. Merci de l'avoir réparé. – sleske

2

Vous pouvez prédéfinir une fonction qui devrait être utilisée pour comparer des valeurs dans votre tableau. perldoc -f sort vous donne un exemple:

# sort using explicit subroutine name 
sub byage { 
    $age{$a} <=> $age{$b}; # presuming numeric 
} 
@sortedclass = sort byage @class; 

opérateur <=> est utilisé pour trier numériquement.

@sorted = sort {$a <=> $b} @unsorted; 
7

Perl sort par ordre alphabétique par défaut trie dans l'ordre ASCII. Pour trier, vous pouvez utiliser numériquement:

@sorted = sort { $a <=> $b } @_; 
+0

Comment cela fonctionne-t-il? – Lazer

+0

@Lazer: Voir mes explications (j'ai soumis la même réponse, juste un peu plus tard ;-)). – sleske

8

offre une fonction de comparaison à sort():

# sort numerically ascending 
my @articles = sort {$a <=> $b} @files; 

# sort numerically descending 
my @articles = sort {$b <=> $a} @files; 

La fonction de tri par défaut est cmp, comparaison de chaînes, qui trierait (1, 2, 10) en (1, 10, 2). <=>, utilisé ci-dessus, est l'opérateur de comparaison numérique.

4
@l = (4109, 4121, 6823, 12967, 12971, 14003, 20186, 1, 3, 4); 
@l = sort { $a <=> $b } @l; 
print "@l\n"; # 1 3 4 4109 4121 6823 12967 12971 14003 20186 

Vous devez fournir votre propre sous-programme de tri { $a <=> $b }

0

Je veux juste gagner beaucoup de temps pour tout le monde, nouveau en Perl (comme moi) qui a cette question, à savoir comment trier un tableau numérique, parce que J'ai non seulement perdu du temps, mais cela m'a rendu fou!

Ainsi, vous trouverez ici (et dans beaucoup d'autres endroits) que la façon de trier un tableau numérique est:

@sorted_array = sort { $a <=> $b } @unsorted_array; 

Maintenant, vous essayez, et vous obtenez une erreur: « Impossible utilisez "my $ a" dans la comparaison ""! (C'est parce que vous avez déjà déclaré '$ a', en utilisant 'strict.pm'). Mais alors, vous ne pouvez pas non plus utiliser des variables non déclarées puisqu'elles seront rejetées comme indéfinies! Donc, vous pourriez vous sentir coincé dans une impasse, comme je l'ai fait.

J'ai dû résoudre ce problème "à la dure", simplement parce que personne ne s'est soucié - que ce soit ici, ou dans perldoc.perl.org, ou dans tout autre endroit que j'ai visité - de mentionner que '$ un 'ET' $ b 'SONT RÉSERVÉS (JETONS) POUR CETTE UTILISATION! (Ceci bien sûr quand on utilise 'strict', lequel devrait l'être, et qui est assez fou parce que 'a' et 'b' sont parmi les variables courtes les plus courantes utilisées en programmation, et logiquement!)

I espérons que cela sera utile à beaucoup de programmeurs, nouveaux chez Perl, qui visiteront cette page!

Questions connexes