3

アルメニア語のアルファベットの並べ替えを修正しようとしています。これは、すべての標準的な Unix ツールとプログラミング言語が文字と単語を並べ替える結果として、2 つの主要な方言 (西方言語) のうちの 1 つだけになるためです。

これを技術的な問題に変換すると、文字の 1 つを並べ替えて、文字間の別の場所に配置します。たとえば、単語が順序方言 (東部) で正しく並べられるように、最後の文字にします。東洋の方言で言えば、この「˙」記号は「単独で」と書かれるのではなく、2文字の「 ˙ 」で書かれる文字の一部です。現在のソートでは、2 文字構成体の後ろに文字" ̂ " が配置されます。

基本的に、ラテン アルファベットの文字 "z" の代わりに文字 "v" を配置したい場合は、完全に似ているはずです。

私は次のようなものを使用しようとしています

#!/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文字の形だけが固定されています.

更新:Perlmonksに示されているように、 tr関数を使用して文字を数字にマップすることでこれを解決できました

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 に答える