3

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

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

基本上,如果你想让例如字母“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中所示

4

2 回答 2

12

如果你还没有这样做的话,你应该看看Unicode::Collat​​e::Locale模块。

use Unicode::Collate::Locale;

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

这打印:

ու
ոց
ոք
ոփ

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

于 2011-10-02T16:17:06.947 回答
-1

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

另一方面,如果您有非常具体的需求,可以使用如下所示的“索引”。要对单个字符进行排序(请注意,丢失的字符会排在第一位):

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;
}
于 2011-10-02T21:23:02.347 回答