在Perl中重新排序字母排序

时间:2011-10-02 15:50:19

标签: perl sorting alphabetical

我正在尝试修复亚美尼亚字母表中的排序,因为所有标准的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

所示

2 个答案:

答案 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;
}