Я не уверен, что это лучший подход к использованию.
Я еще не реализовал модуль 1 в confusables еще в Intl::
, хотя я планирую со временем обойти его, вот два разных способа представить токен в виде. 2
my token confusable($source) {
:my $i = 0; # create a counter var
[
<?{ # succeed only if
my $a = self.orig.substr: self.pos+$i, 1; # the test character A
my $b = $source.substr: $i++, 1; # the source character B and
so $a eq $b # are the same or
|| $a eq %*confusables{$b}.any; # the A is one of B's confusables
}>
. # because we succeeded, consume a char
] ** {$source.chars} # repeat for each grapheme in the source
}
Здесь я использовал динамику c га sh %*confusables
, которая будет каким-либо образом заполнена - это будет зависеть от вашего модуля и даже не обязательно будет Dynami c (например, имея подпись :($source, %confusables)
или ссылаясь на переменную модуля, и т. д. c.
Затем ваш код может работать следующим образом:
say $foo ~~ /<confusable: 'foo'>/
Это, вероятно, лучший способ go о вещах, так как он даст вам гораздо больший контроль - я взял верх у вашего модуля, и ясно, что вы хотите включить 2-к-1 отношения глифа, и в конечном итоге вы, вероятно, захотите чтобы запускать код непосредственно над символами.
Если у вас все в порядке с отношениями 1: 1, вы можете go с гораздо более простым токеном:
my token confusable($source) {
:my @chars = $source.comb; # split the source
@( # match the array based on
|( # a slip of
%confusables{@chars.head} # the confusables
// Empty # (or nothing, if none)
), #
@a.shift # and the char itself
) #
** {$source.chars} # repeating for each source char
}
The @(…)
структура позволяет эффективно создавать adh o c массив для интерполяции. В этом случае мы просто проскальзываем в оригинале, и все. Вы должны быть осторожны, потому что несуществующий элемент ha sh вернет объект типа (Any)
, и это все испортит (отсюда // Empty
)
В любом случае вам понадобится использовать аргументы с вашим токеном, так как построение регулярных выражений на лету чревато потенциальными ошибками и ошибками интерполяции.
1 Юникод вызывает гомографию как "визуально схожих символов", так и "confusables".
2 Dynami c га sh здесь %confusables
может быть заполнено любым количеством способов, и может не обязательно быть динамическим c, так как оно может быть заполнено с помощью аргументов (используя сигнатуру типа :($source, %confusables)
или ссылку на переменную модуля.