Quello che segue è probabilmente il più veloce [1]:
sub my_compare($$) {
$_[0] =~ tr{abdrtwsuiopqe987654}{abcdefghijklmnopqrs}r
cmp
$_[1] =~ tr{abdrtwsuiopqe987654}{abcdefghijklmnopqrs}r
}
my @sorted = sort my_compare @unsorted;
Oppure, se volete qualcosa di più dinamico, potrebbe essere la seguente il più veloce [2]:
my @syms = split //, 'abdrtwsuiopqe987654';
my @map; $map[ord($syms[$_])] = $_ for 0..$#syms;
sub my_compare($$) {
(pack 'C*', map $map[ord($_)], unpack 'C*', $_[0])
cmp
(pack 'C*', map $map[ord($_)], unpack 'C*', $_[1])
}
my @sorted = sort my_compare @unsorted;
Potremmo confrontare il carattere per carattere, ma quello sarà lontano più lento.
use List::Util qw(min);
my @syms = split //, 'abdrtwsuiopqe987654';
my @map; $map[ord($syms[$_])] = $_ for 0..$#syms;
sub my_compare($$) {
my $l0 = length($_[0]);
my $l1 = length($_[1]);
for (0..min($l0, $l1)) {
my $ch0 = $map[ord(substr($_[0], $_, 1))];
my $ch1 = $map[ord(substr($_[1], $_, 1))];
return -1 if $ch0 < $ch1;
return +1 if $ch0 > $ch1;
}
return -1 if $l0 < $l1;
return +1 if $l0 > $l1;
return 0;
}
my @sorted = sort my_compare @unsorted;
Tecnicamente, può essere reso più veloce utilizzando GRT.
my @sorted =
map /\0(.*)/s,
sort
map { tr{abdrtwsuiopqe987654}{abcdefghijklmnopqrs}r . "\0" . $_ }
@unsorted;
Tecnicamente, può essere reso più veloce utilizzando GRT.
my @sorted =
map /\0(.*)/s,
sort
map { (pack 'C*', map $map[ord($_)], unpack 'C*', $_) . "\0" . $_ }
@unsorted;
cmp
è attuato dall'operatore scmp
.
$ perl -MO=Concise,-exec -e'$x cmp $y'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <#> gvsv[*x] s
4 <#> gvsv[*y] s
5 <2> scmp[t3] vK/2
6 <@> leave[1 ref] vKP/REFC
L'operatore scmp
è implementata dalla funzione pp_scmp
in pp.c
, che è in realtà solo un involucro per sv_cmp_flags
in sv.c
quando use locale;
non è in vigore. sv_cmp_flags
utilizza la funzione di libreria C memcmp
o una versione sensibile UTF-8 (in base al tipo di scalare).
dovrebbe probabilmente di cache quelle traslitterazioni, o almeno prendere nota del calcolo ripetuto che si verificherebbe se ci fossero duplicati. –
@Hunter McMillen, non penso che i guadagni saranno così grandi, ma ho aggiunto le soluzioni GRT. – ikegami
dipende dai dati. –