De la réponse de perlfaq4 à How do I sort an array by (anything)?
offre une fonction de comparaison pour trier() (décrit dans une sorte dans perlfunc):
@list = sort { $a <=> $b } @list;
La fonction de tri par défaut est cmp, comparaison de chaînes, w qui trierait (1, 2, 10) en (1, 10, 2). < =>, utilisé ci-dessus, est l'opérateur de comparaison numérique.
Si vous avez besoin d'une fonction compliquée pour extraire la pièce que vous voulez trier, ne le faites pas dans la fonction de tri. Tirez-le d'abord, car le type BLOCK peut être appelé plusieurs fois pour le même élément. Voici un exemple de la façon de retirer le premier mot après le premier nombre sur chaque élément, puis de trier ces mots sans tenir compte de la casse.
@idx =();
for (@data) {
($item) = /\d+\s*(\S+)/;
push @idx, uc($item);
}
@sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
qui pourrait aussi être écrit de cette façon, en utilisant un truc qui est d'être connu comme Transformée Schwartzienne:
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [ $_, uc((/\d+\s*(\S+)/)[0]) ] } @data;
Si vous devez trier sur plusieurs champs, le paradigme suivant est utile.
@sorted = sort {
field1($a) <=> field1($b) ||
field2($a) cmp field2($b) ||
field3($a) cmp field3($b)
} @data;
Ceci peut être commodément combiné avec le précalcul des clés comme indiqué ci-dessus.Voir l'article de tri dans la collection «Bien plus que vous ne l'avez jamais voulu savoir» au http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz pour en savoir plus sur cette approche.
Voir aussi la question plus loin dans perlfaq4 sur les hachages de tri.
J'aime la brièveté! – Zaid
Vous devriez faire la Transformation Schwartzienne pour ne pas avoir à recalculer deux fois les parties comparables pour chaque élément. Surtout si le format n'est pas rigide. – dlamblin
L'optimisation prématurée est la racine de tous les maux. Ne pensez-vous pas que "substr" va être aussi rapide ou plus rapide qu'une recherche de hash? – jrockway