Могу ли я использовать оператор y для транслитерации, отличной от однозначной, в Perl?

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

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

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

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

Заранее спасибо за любое руководство :)


person Mike    schedule 03.12.2009    source источник
comment
Если инструмент, который вы пытаетесь использовать, не делает того, что вам нужно, найдите другой инструмент. y/// транслитерирует только один к одному.   -  person brian d foy    schedule 03.12.2009
comment
@Брайан, спасибо за комментарий. Я думал, что мы можем изменить ограничение оператора y один к одному. Глупо с моей стороны :)   -  person Mike    schedule 04.12.2009


Ответы (2)


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

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";

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

person Community    schedule 03.12.2009
comment
@Kinopiko, звучит неплохо. По крайней мере, мне не нужно делать много механических замен :) - person Mike; 03.12.2009
comment
@Kinopiko, за этот ответ до сих пор проголосовали коллеги в шестой раз. Я убежден, что оператор y не может выполнить работу, которую я ожидал. Мы просто не можем изменить его, как мы меняем разделитель ввода по умолчанию в Perl. Спасибо :) Если бы я использовал хэш для решения этой проблемы, мой код был бы таким: open my $in,'‹',./test.txt; мой %trans = qw/ā ei ä ​​a: ō əu o ɒ/; мои @keys = ключи %trans; для моего $key (@keys){ while(‹$in›){ s/($key)/$trans{$1}/; Распечатать; } } пожалуйста, поправьте меня, если вы видите что-то подозрительное. Спасибо еще раз :) - person Mike; 03.12.2009
comment
@Kinopiko и @ysth, спасибо за объяснение. Я не знал [] и || можно использовать таким образом, как в проиллюстрированном коде. - person Mike; 03.12.2009
comment
Извините, я, вероятно, должен был дать понять, что оператор y этого не делает в моем ответе. Он может конвертировать только отдельные символы. - person ; 03.12.2009

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

person brian d foy    schedule 03.12.2009
comment
@brian, спасибо, что познакомили меня с этим интересным модулем :) Но я думаю, что это лишь незначительно относится к тому, что я пытался сделать. Я хотел транслитерировать одну систему символов произношения в другую, которая несколько отличается от пословного преобразования Text::Unaccent::PurePerl. - person Mike; 04.12.2009
comment
Ну, это делает ту же работу: вы заменяете символы, возможно, несколькими символами. Топологически это то же самое. - person brian d foy; 04.12.2009