Могу ли я использовать оператор y для выполнения транслитерации не один-к-одному в Perl? - PullRequest
3 голосов
/ 03 декабря 2009

Оператор y в Perl выполняет посимвольную транслитерацию. Например, если мы сделаем y / abc / dfg для строки «foobar», мы получим «foofdr». Но что если я захочу транслитерировать «а» на «ei» и «ä» на «a:» и «ō» на «әu» и «o» на «ɒ».

Я попробовал следующую строку кода, но не повезло: (

y/āäōo/(ei)(a:)(әu)ɒ/

Надеемся, у нас есть обходной путь для этой проблемы? Или мне приходится многократно использовать оператор s и делать много громоздких подстановок?

Заранее спасибо за любые рекомендации:)

Ответы [ 2 ]

14 голосов
/ 03 декабря 2009

В этом случае создайте хеш и легко переходите от ключей к строкам.

use warnings;
use strict;
use utf8;
binmode STDOUT, ":utf8";
my $string = "āäōo";
my %trans = qw/ā ei ä a: ō u o ɒ/;
my $keys = join '', keys %trans;
$string =~ s/([$keys])/$trans{$1}/g;
print "$string\n";

Вам необходимо изменить это, если ваши ключи имеют длину более одного символа, сортируя ключи в порядке уменьшения длины и соединяя их, используя ( | | ) вместо [ ].

0 голосов
/ 03 декабря 2009

Похоже, вы пытаетесь сделать что-то похожее на Text :: Unaccent :: PurePerl .

...