Прежде всего, ваш код не является допустимым Perl и может не выполнять то, что вы думаете.Всегда
use strict;
use warnings;
во главе вашей программы, чтобы разрешить любые простые ошибки.Код должен выглядеть следующим образом:
$myhash{'ANN20021015_0101_XML_71.9'} = ["anta", "hunna", "huma"];
$myhash{'ANN20021115_0049_XML_14.1'} = ["lqd", "qAl", "arrajul"];
$myhash{'ANN20021115_0049_XML_14.2'} = ["anna", "alwalada"];
Для сортировки по чему-то, кроме целого значения, вы можете преобразовать $a
и $b
в блоке сортировки и отсортировать результат численно <=>
вместо строкового<=>
.Этот код делает то, что вам нужно
my @sorted = sort {
my ($aa) = $a =~ /.*_(.+)/;
my ($bb) = $b =~ /.*_(.+)/;
$aa <=> $bb;
} keys %myhash;
Но если у вас большой объем данных, может быть выгодно использовать Шварцево преобразование , которое позволит избежать извлечениячисловая часть ваших строк каждый раз, когда они сравниваются
my @sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { /.*_(.+)/ and [$_, $1] }
keys %myhash;