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

发布于 2024-08-13 22:00:10 字数 283 浏览 10 评论 0原文

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

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

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

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

提前感谢您的任何指导:)

The y operator in Perl does character-by-character transliteration. For example, if we do y/abc/dfg to the string "foobar", we get "foofdr". But what if I want to transliterate "ā" to "ei" and "ä" to "a:" and "ō" to "әu" and "o" to "ɒ".

I tried the following line of code but no luck:(

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

Do we hopefully have a workaround for this problem? Or do I have to repeatedly use the s operator and do a lot of cumbersome substitutions?

Thanks in advance for any guidance :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暖伴 2024-08-20 22:00:10

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

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

如果您的密钥长度超过一个字符,则需要更改此设置,方法是按长度递减的顺序对密钥进行排序,并使用 ( | | ) 而不是 [ ] 连接它们。

In this case, create a hash and go from the keys to the strings easily.

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

You need to alter this if your keys are more than one character long by sorting the keys in order of decreasing length and joining them using ( | | ) instead of [ ].

木緿 2024-08-20 22:00:10

听起来您正在尝试执行类似于 Text::Unaccent:: 的操作PurePerl

It sounds like you're trying to do something similar to Text::Unaccent::PurePerl.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文