How*_*ard 6 unicode perl utf-8 codepoint
例如,
my $str = '??c'; # Chinese language of china
Run Code Online (Sandbox Code Playgroud)
我想打印出数值
20013,22283,99
Run Code Online (Sandbox Code Playgroud)
cjm*_*cjm 13
unpack会比split和更高效ord,因为它不需要制作一堆临时的1个字符的字符串:
use utf8;
my $str = '??c'; # Chinese language of china
my @codepoints = unpack 'U*', $str;
print join(',', @codepoints) . "\n"; # prints 20013,22283,99
Run Code Online (Sandbox Code Playgroud)
快速基准测试显示它比split+ord以下快3倍:
use utf8;
use Benchmark 'cmpthese';
my $str = '????????????????????????????c';
cmpthese(0, {
'unpack' => sub { my @codepoints = unpack 'U*', $str; },
'split-map' => sub { my @codepoints = map { ord } split //, $str },
'split-for' => sub { my @cp; for my $c (split(//, $str)) { push @cp, ord($c) } },
'split-for2' => sub { my $cp; for my $c (split(//, $str)) { $cp = ord($c) } },
});
Run Code Online (Sandbox Code Playgroud)
结果:
Rate split-map split-for split-for2 unpack
split-map 85423/s -- -7% -32% -67%
split-for 91950/s 8% -- -27% -64%
split-for2 125550/s 47% 37% -- -51%
unpack 256941/s 201% 179% 105% --
Run Code Online (Sandbox Code Playgroud)
较短的字符串差异不太明显,但unpack速度仍然快两倍.(split-for2比其他拆分快一点,因为它不构建代码点列表.)