web-dev-qa-db-fra.com

Comment trier les nombres en Perl?

print "@_\n";
4109 4121 6823 12967 12971 14003 20186

Comment puis-je le trier en Perl?

Utiliser @sorted = sort(@_); me donne un ordre alphabétique

13041 13045 14003 20186 4109 4121 6823

Comment puis-je obtenir une commande numérique? Est-ce que Perl a des fonctions intégrées pour le tri par fusion, le tri par insertion, etc.?

22
Lazer

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 uniquement constituée de 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 transmet toujours les deux valeurs à comparer en tant que $a, $b et la fonction de comparaison doit renvoyer 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éé uniquement à cette fin :-).

Solution volée sans vergogne à " Perl Cookbook ", Chapitre 04 Sous-chapitre 15 (achetez le livre - ça vaut le coup!)

46
sleske

Fournit 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. 

9
Eugene Yarmash

La valeur sort de Perl est triée par défaut par ordre alphabétique dans l'ordre ASCII. Pour trier numériquement, vous pouvez utiliser:

@sorted = sort { $a <=> $b } @_;
8
codaddict

Ceci est une FAQ Perl. A partir de la ligne de commande:

perldoc -q sort

perlfaq4: Comment trier un tableau par (quelque chose)?

6
toolic
@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 }

5
adamse

Vous pouvez utiliser une fonction prédéfinie qui devrait être utilisée pour comparer les valeurs de votre tableau perldoc -f sort vous en donne un exemple:

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

L'opérateur <=> est utilisé pour effectuer un tri numérique.

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

Je veux juste gagner beaucoup de temps pour tous les nouveaux venus dans Perl (comme moi) qui ont cette question, c'est-à-dire comment trier un tableau numérique, car non seulement j'ai perdu du temps, mais cela m'a rendu fou!

Donc, vous trouvez ici (et dans beaucoup d'autres endroits) que la manière de trier un tableau numérique est la suivante:

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

Maintenant, vous essayez, et vous obtenez une erreur: "ne peut pas utiliser" mon $ a "dans la comparaison de tri"! (C'est parce que vous avez déjà déclaré '$ a' en utilisant 'strict.pm'). Mais vous ne pouvez pas non plus utiliser de variables non déclarées, car elles seront rejetées comme non définies! Donc, vous pourriez vous sentir pris au piège dans une impasse, comme je l'ai fait. 

Je devais résoudre ce problème "à la dure", simplement parce que personne ne s'en souciait - ni ici, ni sur perldoc.Perl.org, ni dans aucun autre lieu que j'ai visité - pour mentionner que '$ a' AND ' $ b 'SONT RÉSERVÉS (JETONS) POUR CET UTILISATION! (Ceci bien sûr quand on utilise 'strict', ce qu'il faut. Et ce qui est assez fou, parce que 'a' et 'b' sont parmi les variables courtes les plus courantes utilisées dans la programmation, et logiquement!)

J'espère que cela aidera beaucoup de programmeurs, nouveaux à Perl, qui visiteront cette page! 

0
Apostolos