Cela peut ne pas valoir la peine dans ce cas particulier, mais la technique Schwartzian transform peut aussi être utilisée avec le tri multi-critères. Comme cela (codepad):
use warnings;
use strict;
my %myhash = (
cat_2 => 0, cat_04 => 1,
cat_03 => 0, dog_02 => 3,
cat_10 => 0, cat_01 => 3,
);
my @sorted =
map { [$_->[0], $myhash{$_->[0]}] }
sort { $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] }
map { m/([0-9]+)$/ && [$_, $myhash{$_}, $1] }
keys %myhash;
print $_->[0] . ' => ' . $_->[1] . "\n" for @sorted;
De toute évidence, la clé de cette technique est d'utiliser plus d'un élément supplémentaire dans le cache. Deux choses ici: 1) @sorted
devient en fait un tableau de tableaux (chaque élément de ce tableau est une paire clé-valeur); 2) le tri dans cet exemple est basé sur le suffixe des chiffres des touches (avec une comparaison numérique, pas une chaîne), mais il peut être ajusté dans n'importe quelle direction si nécessaire.
Par exemple, lorsque les touches modèle de correspondance XXX_DD_XXX (et il est DD qui doit être comparé), changer la deuxième map
clause avec ceci:
map { m/_([0-9]+)_/ && [$_, $myhash{$_}, $1] }
'2_' est inférieur à' 34' numériquement et alphabétiquement donc c'est un mauvais exemple. Mais je sais ce que tu voulais dire.mis à jour ma réponse –