Perl Unicode 烹饪书:使 cmp 在文本上而不是码点上工作
℞ 38: 使 cmp
在文本上而不是码点上工作
即使使用 Perl 5.12 的 “unicode_strings” 功能,Perl 的某些核心操作默认情况下在 Unicode 字符串上并不按预期执行。例如,cmp
操作符如何知道其参数是字节、更大的码点还是图形符号,或者是否应该生效特定的排序规则呢?
你可能这样写
@srecs = sort {
$b->{AGE} <=> $a->{AGE}
||
$a->{NAME} cmp $b->{NAME}
} @recs;
… 应该使用 Unicode::Collate 进行对 Unicode 感知的比较
my $coll = Unicode::Collate->new();
for my $rec (@recs) {
$rec->{NAME_key} = $coll->getSortKey( $rec->{NAME} );
}
@srecs = sort {
$b->{AGE} <=> $a->{AGE}
||
$a->{NAME_key} cmp $b->{NAME_key}
} @recs;
此模块的 getSortKey()
方法返回一个适当的 形式排序键,它尊重给定 Unicode 字符串的适当排序规则(和排序级别)。cmp
可以有效地处理这些键。
上一篇文章: ℞ 37: Unicode 区域设置排序
系列索引: 标准序言
下一篇文章: ℞ 39: 不区分大小写和重音的对比
标签
反馈
这篇文章有什么问题?请通过在 GitHub 上打开一个 issue 或 pull request 来帮助我们。