gpt4 book ai didi

perl - Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序和排序?

转载 作者:行者123 更新时间:2023-12-03 11:02:42 25 4
gpt4 key购买 nike

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

  • use Unicode::Collate $Collator = Unicode::Collate->new();
  • use Unicode::Collate::Locale $Collator = Unicode::Collate->new(locale => $ENV{'LANG'});
  • use locale

  • 他们每个人都因以下错误而失败(来自 Perl 方面):
  • 输入未排序:[----,] 在 [($1]
  • 之后)
  • 输入未排序:[...] 出现在 [&]
  • 之后
  • 输入未排序:[($1] 在 [1] 之后

  • 唯一对我有用的方法是设置 LC_ALL=C用于排序,并在 Perl 中使用 8 位字符。但是,这样 Unicode 字符串的排序不正确。

    最佳答案

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

    关于perl - Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序和排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835561/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com