加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl和Unix如何对同一序列中的Unicode字符串进行排序?

发布时间:2020-12-15 21:23:12 所属栏目:大数据 来源:网络整理
导读:我试图获得Perl和GNU / Linux排序(1)程序同意如何排序Unicode字符串。我运行排序与LANG = en_US.UTF-8。在Perl程序中,我尝试了以下方法: use Unicode::Collate with $ Collat??or = Unicode :: Collat??e- new(); use Unicode::Collate::Locale with $ Col
我试图获得Perl和GNU / Linux排序(1)程序同意如何排序Unicode字符串。我运行排序与LANG = en_US.UTF-8。在Perl程序中,我尝试了以下方法:

> use Unicode::Collate with $ Collat??or = Unicode :: Collat??e-> new();
> use Unicode::Collate::Locale with $ Collat??or = Unicode :: Collat??e-> new(locale => $ ENV {‘LANG’});
> use locale

每一个失败,出现以下错误(从Perl端):

>输入未排序:[—-,]在[($ 1]
>输入不排序:[…]
>输入未排序:[($ 1]在[1]之后

唯一适用于我的方法涉及设置LC_ALL = C以进行排序,并在Perl中使用8位字符。但是,以这种方式,Unicode字符串不正确排序。

解决方法

使用Unicode :: Sort或Unicode :: Sort :: Locale没有意义。您不是尝试基于Unicode定义排序,您正在尝试根据您的区域设置排序。这就是使用locale;是为。

我不知道为什么你没有得到所需的命令cmp下使用locale ;.

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

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

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

我发现一个case使用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

说实话,这是排序实用程序是奇怪的。

在评论中,@ninjalj指出,奇怪可能是由于具有未定义权重的字符。当比较这些字符时,排序是未定义的,因此不同的引擎可能产生不同的结果。你最好重新创建确切的顺序是通过IPC::Run3使用排序实用程序,但它似乎并不保证总是导致相同的顺序。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读