在Perl中分裂很长音译的效率

cal*_*llo 2 perl performance transliteration processing-efficiency

我有这么长的音译:

$text =~ tr/áà?â?å?ä?ã???????????????ç??????ð????éè?ê?ë????????/aaaaaaaaaaaaaaaaabbbbcccccccccdddddddeeeee/;
# Etc. (About 400 chars)
Run Code Online (Sandbox Code Playgroud)

我想将它分成几个音译,因为生成的代码更容易维护:

$text =~ tr/áà?â?å?ä?ã???????/aaaaaaaaaaaaaaaaa/;
$text =~ tr/????/bbbb/;
$text =~ tr/????ç????/ccccccccc/;
# Etc.
Run Code Online (Sandbox Code Playgroud)

我相信这会让事情变得缓慢,但我想肯定地知道.此过程在非常繁忙的服务器上每秒运行大约1000次.

谢谢.

ike*_*ami 7

你可以建立一个音译器:

my %translits = (
   'áà?â?å?ä?ã???????' => 'a',
   '????'              => 'b',
   '????ç????'         => 'c',
);

my $pat  = '';
my $repl = '';
for (keys(%translit)) {
   $pat  .= $_;
   $repl .= $translit{$_} x length($_);
}

my $tr1 = eval "sub { tr/\Q$pat\E/\Q$repl\E/ }" or die $@;
   -or-
my $tr2 = eval "sub { \$_[0] =~ tr/\Q$pat\E/\Q$repl\E/ }" or die $@;
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

$tr1->() for $str;
   -or-
$tr2->($str);
Run Code Online (Sandbox Code Playgroud)

当然,你总是可以使用Text :: Unidecode.