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.?
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!)
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.
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 } @_;
Ceci est une FAQ Perl. A partir de la ligne de commande:
perldoc -q sort
@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 }
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;
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!