我可以使用y运算符在Perl中进行非一对一的音译吗?

时间:2009-12-03 05:17:11

标签: perl transliteration

Perl中的y运算符执行逐个字符的音译。例如,如果我们对字符串“foobar”执行y / abc / dfg,则会得到“foofdr”。但是,如果我想将“ā”音译为“ei”,将“ä”音译为“a:”,将“ō”音译为“әu”,将“o”音译为“ɒ”。

我尝试了以下代码行,但没有运气:(

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

我们希望有解决此问题的方法吗?或者我是否必须重复使用s运算符并进行大量繁琐的替换?

提前感谢任何指导:)

2 个答案:

答案 0 :(得分:14)

在这种情况下,创建一个哈希并轻松地从键到字符串。

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

如果您的密钥长度超过一个字符,则需要通过按长度递减的顺序对密钥进行排序并使用( | | )而不是[ ]加入密钥来更改此字段。

答案 1 :(得分:0)

听起来你正在尝试做类似于Text::Unaccent::PurePerl的事情。