J'ai un éventail de tâches de Perl de tâches qui ressemble à ceci:
@todos = ( "1 (A) Complete online final @evm4700 t:2010-06-02", "6 (A) t:2010-05-30 Pick up dry cleaning", "4 (B) Clean t:2010-05-30", "2 (C) Call Chris Johnson t:2010-06-01" "3 Write thank-you t:2010-06-10", "5 Donate to LSF t:2010-06-02", );
5 Réponses :
On dirait que vous voulez que vous voulez le : "[" Est le personnage après "Z"; Donner à cette "priorité" à des articles sans-portes les trier après les éléments hiérarchisés. p> alternativement, et peut-être plus facilement grasable: p>
@San: tandis que la transformation schwartzienne est groovy (et applicable), il est très difficile de suivre, surtout étant donné que l'OP est un débutant.
@San - c'est une solution cool; Je vous remercie. Avez-vous besoin d'échapper à ce ] code> Ater: alpha:? @ZAID - Même si je suis un débutant, @san m'a donné ce lien qui explique la transformation de Schwartzian, donc je peux le comprendre. :)
@Abach: Non, pas d'échappement nécessaire; Ceci est une classe de caractères POSIX. (Voir la page de l'homme de Perlre.) ... Mais j'ai fait une faute de frappe ("[: alpha]]" au lieu de "[[: alpha:]]", que je viens de corriger.
@San - a fière allure. Merci. :)
10 code> devrait aller après
9 code> (vous avez besoin de tri numérique)
@Abach: ça me va bien si ça te va! Rappelez-vous juste que Perl n'a pas besoin d'être si difficile à suivre ...
@ J.f. Sebastian: Ce n'est pas nécessaire; Ces identifiants ne sont pas facturés dans le schéma de tri dont j'ai besoin. J'ai mis à jour ma question initiale pour préciser que les tâches doivent être commandées par la priorité décroissante (à partir de A - Z, suivie d'éléments prioritaires).
@Zaid à mon avis Transformation Schwarzian est extrêmement intuitive et propre, étant donné à quel point une autre alternative Perl a tendance à être non traditionnelle, il pourrait être un peu subjectif, Sean merci, BTW La comparaison ne fonctionne pas lors de l'utilisation de GT, LT>
Voici fixé @ Solution de Sean qui utilise un tri numérique pour la tâche ID (Ainsi, la 10ème tâche va après 9th car elle devrait):
my @sorted_todos = map { $_->[0] } sort { $a->[1][1] cmp $b->[1][1] # A || $a->[1][0] <=> $b->[1][0] # 1 } map { [ $_, /^(\d+) \(([[:alpha:]])\)/ ? [$1, $2] : [0, "zz"]] } @todos;
Pour quelque chose de ce mineur, éditer la réponse de Sean semble suffisante. Vous ne manquez pas exactement pour le représentant.
@RJH: Lisez les commentaires à la réponse de Sean L'OP ne veut pas que la solution que j'ai fournie, il serait donc faux de ma part d'éditer la réponse de Sean. D'autre part, ma réponse est utile pour les autres qui rechercheraient "Sort personnalisé en Perl" à l'avenir.
Voici une version assez explicite sur la manière dont cela fonctionne:
my @sorted_todos = sort { my ($right_prio) = ($b =~ /^\d+\s+\(([A-Z])\)/); return -1 unless defined $right_prio; my ($left_prio) = ($a =~ /^\d+\s+\(([A-Z])\)/); return 1 unless defined $left_prio; return $left_prio cmp $right_prio; } @todos;
use Sort::Key 'keysort'; my @sorted = keysort { /^\d+\s+\(([A-Z])\)/ ? $1 : 'ZZ' } @todos;
Solution beaucoup plus simple:
sort {($a =~ /\((.)\)/)[0] cmp ($b =~ /\((.)\)/)[0]} @todos;