例如,
my $str = '中國c'; # Chinese language of china
我想打印出数值
20013,22283,99
最佳答案
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
快速基准测试表明它比
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) } },
});
结果:
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% --
使用较短的字符串时,差异不太明显,但
unpack
仍然是两倍多。 ( split-for2
比其他拆分快一点,因为它不构建代码点列表。)
关于perl - 在 Perl 中将 UTF8 字符串转换为数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3542449/