Как я могу заменить в строках в Perl 6 кодовую точку, а не графему? - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно удалить диакритические метки из строки, используя Perl 6. Я попытался сделать это:

my $hum = 'חוּם';
$ahm.subst(/<-[\c[HEBREW LETTER ALEF] .. \c[HEBREW LETTER TAV]]>/, '', :g);

Я пытаюсь удалить все символы, которые находятся за пределами диапазона между буквой иврита (א) и буквой иврита (ת). Я ожидал, что следующий код возвратит «חום», однако он возвращает «חם».

Полагаю, что по умолчанию Perl 6 работает с графемами, считает וּ одной графемой и удаляет все это. Часто разумно работать графами, но в моем случае мне нужно, чтобы он работал по кодам.

Я попытался найти наречие, которое бы работало по кодам, но не смогло его найти. Возможно, в Perl 6 также есть способ использовать свойства Unicode, чтобы исключить диакритические знаки, или включить только буквы, но я также не смог найти это.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Мое регулярное выражение слабое, поэтому я бы выбрал менее волшебное решение.

Во-первых, вы можете удалить все отметки с помощью samemark :

'חוּם'.samemark('a')

Во-вторых, вы можете разложить графемы с помощью .NFD и работать с отдельными кодовыми точками - например, только сохраняя значения со свойством Grapheme_Base - и затем перекомпоновывать строку:

Uni.new('חוּם'.NFD.grep(*.uniprop('Grapheme_Base'))).Str

В случае смешанных строк,удаление меток только с еврейских символов может выглядеть так:

$str.subst(:g, /<:Script<Hebrew>>+/, *.Str.samemark('a'));
0 голосов
/ 10 сентября 2018

Вот простой подход:

my $hum = 'חוּם';
my $min = "\c[HEBREW LETTER ALEF]".ord;
my $max = "\c[HEBREW LETTER TAV]".ord;
my @ords;
for $hum.ords {
    @ords.push($_) if $min ≤ $_ ≤ $max; 
}
say join('', @ords.map: { .chr });

Вывод :

חום
...