Если перед кодом всегда стоит _
, а код всегда в конце
use Sort::Key qw( ikeysort );
my @order = qw( sf ef vld val );
my %order = map { $order[$_] => $_ } 0..$#order;
my @sorted = ikeysort { /_([^_\W]+)\z/ ? $order{$1} : 0 } @unsorted;
Выше приведена более быстрая и понятная версия следующего:
my @order = qw( sf ef vld val );
my %order = map { $order[$_] => $_ } 0 .. $#order;
my @sorted =
sort {
my $key_a = /_([^_\W]+)\z/ ? $order{$1} : 0;
my $key_b = /_([^_\W]+)\z/ ? $order{$1} : 0;
$key_a <=> $key_b || $a cmp $b
}
@unsorted;
В противном случае
use Sort::Key qw( ikeysort );
my @order = qw( sf ef vld val );
my %order = map { $order[$_] => $_ } 0..$#order;
my $alt = join '|', map quotemeta, @order;
my $re = qr/($alt)/;
my @sorted = ikeysort { /$re/ ? $order{$1} : 0 } @unsorted;
Выше приведена более быстрая и понятная версия следующего:
my @order = qw( sf ef vld val );
my %order = map { $order[$_] => $_ } 0..$#order;
my $alt = join '|', map quotemeta, @order;
my $re = qr/($alt)/;
my @sorted =
sort {
my $key_a = /$re/ ? $order{$1} : 0;
my $key_b = /$re/ ? $order{$1} : 0;
$key_a <=> $key_b || $a cmp $b
}
@unsorted;