【问题标题】:re-order alphabet sorting in Perl在 Perl 中重新排序字母排序
【发布时间】:2011-10-02 15:50:19
【问题描述】:

我正在尝试修复亚美尼亚字母表中的排序问题,因为所有标准 Unix 工具和编程语言都会对字母和单词进行排序,结果只有 2 种主要方言(西方)中的一种。

将其转换为技术问题是重新排序一个字符“ւ”,将其放在字母之间的不同位置,假设将其设为最后一个字符,以便单词排序正确的顺序方言(东部)。从东方方言的语言上讲,这个“ւ”符号不是“独立的”,而是用两个字符“ու”书写的字母的一部分。当前排序将字母“ու”放在“ոք”或“ոփ”两个字母结构之后。

基本上,如果你想制作 e,它应该是完全相似的。 G。字母“v”在拉丁字母中代替字母“z”。

我正在尝试使用类似的东西

#!/usr/bin/perl -w
use strict;

my (@sortd, @unsortd, $char_u, $char_x);
#@unsortd = qw(աբասի ապուշ ապրուստ թուր թովիչ թոշակ թոք);
@unsortd = qw(ու ոց ոք ոփ);

@sortd = sort {
  $char_u = "ւ";
  $char_x = split(//, @unsortd);
  if ($char_u gt $char_x) {
    1;
  } else {
    return $a cmp $b;
  } 
} @unsortd;

print "@sortd\n";

但这并不适用于整个单词,只有 2 个字母形式是固定的。

更新:我能够使用 tr 函数将字母映射到数字来解决这个问题,如 Perlmonks

所示

【问题讨论】:

  • 您永远不应该使用代码点比较对文本进行排序;它永远不会是正确的。这就是 Unicode::CollateUnicode::Collate 存在的原因。

标签: perl sorting alphabetical


【解决方案1】:

如果您还没有这样做,您应该看看Unicode::Collate::Locale 模块。

use Unicode::Collate::Locale;

my $collator = Unicode::Collate::Locale->new(locale => "hy");
@sortd = $collator->sort(@unsortd);
print join("\n", @sortd, '');

打印出来:

ու
ոց
ոք
ոփ

(我不确定这是您期望的输出,但该模块和 Unicode::Collate 包含大量信息,根据您的需要创建自定义排序规则可能比滚动更容易你自己的。)

【讨论】:

  • 我尝试了 Unicode:Collat​​e 和 use:locale,但它是一样的。我需要类似的代码,在单词顺序中将一些拉丁字母放在“z”的位置。
  • @user278192 你不想要use locale——几乎永远!你想要Unicode::Collate::Locale,并在构造函数中指定亚美尼亚语言环境。
【解决方案2】:

@mat 建议的标准字母 Unicode::Collate::Locale 应该是首选。

另一方面,如果你有非常具体的需求,可以使用如下的`index'。对单个字符进行排序(注意缺失的字符会排在第一位):

my $alphabet_A = "acb";
sub by_A {index($alphabet_A,$a) <=> index($alphabet_A,$b)};

...

my @sorted = sort by_A @unsorted;

换句话说,可以在 by_A 的定义中包含一个循环。为了以下工作,定义函数 min() 并微调不同长度单词的大小写:

sub by_A {
    $flag=0;
    foreach my $i (0..min(length($a),length($b))-1) { 
        return ($flag) if ($flag);
        $flag = ($flag or 
                 index($alphabet_A,substr($a,$i,1)) <=> index($alphabet_A,substr($b,$i,1)));
    }
    return $flag;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 2011-11-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2014-12-21
    相关资源
    最近更新 更多