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 来帮助我们。