Perl和Unix如何排序,以相同的顺序排序Unicode字符串?

时间:2014-09-14 16:40:55

标签: perl sorting unix unicode locale

我正在尝试让Perl和GNU / Linux sort (1)程序就如何对Unicode字符串进行排序达成一致。我正在使用LANG=en_US.UTF-8运行 sort 。在Perl程序中,我尝试了以下方法:

其中每一个都因以下错误而失败(来自Perl方面):

  • 输入未排序:[----,]来自[($ 1]
  • 之后
  • 输入未排序:[...]来自[&]
  • 输入未排序:[($ 1)在[1]
  • 之后出现

唯一适用于我的方法包括为排序设置LC_ALL=C,并在Perl中使用8位字符。但是,这样就没有正确排序Unicode字符串。

1 个答案:

答案 0 :(得分:5)

使用Unicode :: Sort或Unicode :: Sort :: Locale是没有意义的。您不是要尝试基于Unicode定义进行排序,而是尝试根据您的语言环境进行排序。这就是use locale;的用途。

我不知道为什么你没有从cmp下的use locale;获得所需的订单。

您可以处理解压缩的文件。

for q in file1.uniqc file2.uniqc ; do
   perl -ne's/^\s*(\d+) //; for $c (1..$1) { print }' "$q"
done | sort | uniq -c

当然,它需要更多的临时存储空间,但你会得到你想要的顺序。


我发现案例use locale;没有导致Perl的sort / cmp提供与sort实用程序相同的结果。奇怪的。

$ export LC_COLLATE=en_US.UTF-8

$ perl -Mlocale -e'print for sort { $a cmp $b } <>' data
(
($1
1

$ perl -MPOSIX=strcoll -e'print for sort { strcoll($a, $b) } <>' data
(
($1
1

$ sort data
(
1
($1

说实话,这是sort实用程序很奇怪。


在评论中,@ ninjalj指出,奇怪的可能是由于权重未定义的字符。在比较这些字符时,排序是不确定的,因此不同的引擎可能会产生不同的结果。重新创建确切顺序的最佳选择是通过IPC::Run3使用sort实用程序,但听起来并不能保证总是会产生相同的顺序。