我正在尝试修复亚美尼亚字母表中的排序,因为所有标准的Unix工具和编程语言只对2种主要方言中的一种(西方)排序字母和单词。
将此转换为技术问题是重新排序其中一个字符“ւ”,将其放在字母之间的不同位置,让我们说它是最后一个字符,以便单词被排序正确的方言方言(东方)。在语言上用东方方言来说,这个“ւ”符号并不是“独立的”,而是用2个字符“ու”写成的字母的一部分。当前的排序将字母“ու”放在“ոք”或“ոփ”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
所示答案 0 :(得分:12)
如果你还没有这样做,你应该看一下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
有很多信息,根据您的需要创建自定义排序可能更容易而不是自己滚动。)
答案 1 :(得分:-1)
对于@mat建议的标准字母Unicode::Collate::Locale
应该是第一选择。
另一方面,如果您有非常具体的需求`索引'可以使用如下。要对单个字符进行排序(请注意首先缺少字符):
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;
}