如何删除Perl 6中的变音符号

Eug*_*sky 6 perl6

两个相关的问题.Perl 6非常聪明,它将字形理解为一个字符,无论是一个Unicode符号(如ä,U+00E4)还是两个或多个组合符号(如p???).这个小代码

my @symb;
@symb.push("ä");
@symb.push("p" ~ 0x304.chr); # "p?" 
@symb.push("?" ~ 0x323.chr); # "??"
say "$_ has {$_.chars} character" for @symb;
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

ä has 1 character
p? has 1 character
?? has 1 character
Run Code Online (Sandbox Code Playgroud)

但有时我希望能够做到以下几点.1)从中删除变音符号ä.所以我需要一些方法

"ä".mymethod ? "a"
Run Code Online (Sandbox Code Playgroud)

2)将"组合"符号拆分成部分,即拆分p?pCombining Macron U+0304.例如以下内容bash:

$ echo p? | grep . -o | wc -l
2
Run Code Online (Sandbox Code Playgroud)

cal*_*ter 5

Perl 6 在Str类中具有强大的 Unicode 处理支持。要执行您在 (1) 中要求的操作,您可以使用该samemark方法/例程。

\n\n\n\n

根据文档:

\n\n
\n
multi sub samemark(Str:D $string, Str:D $pattern --> Str:D)\nmethod    samemark(Str:D: Str:D $pattern --> Str:D)\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回 的副本,$string其中每个字符的标记/重音信息已更改,以便它与 中相应字符的标记/重音相匹配$pattern。如果$string长于$pattern,则 中的其余字符将$string接收与 中最后一个字符相同的标记/重音$pattern。如果$pattern为空,则不会进行任何更改。

\n\n

例子:

\n\n
say \'\xc3\xa5\xc3\xa4\xc3\xb6\'.samemark(\'a\xc3\xa4o\');                        # OUTPUT: \xc2\xaba\xc3\xa4o\xe2\x90\xa4\xc2\xbb \nsay \'\xc3\xa5\xc3\xa4\xc3\xb6\'.samemark(\'a\');                          # OUTPUT: \xc2\xabaao\xe2\x90\xa4\xc2\xbb \n\nsay samemark(\'P\xc3\xaarl\', \'a\');                        # OUTPUT: \xc2\xabPerl\xe2\x90\xa4\xc2\xbb \nsay samemark(\'a\xc3\xb6\xc3\xa4\', \'\');                          # OUTPUT: \xc2\xaba\xc3\xb6\xc3\xa4\xe2\x90\xa4\xc2\xbb \n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

这既可以用于从字母中删除标记/变音符号,也可以用于添加它们。

\n\n

对于(2),有几种方法可以做到这一点(TIMTOWTDI)。如果您想要字符串中所有代码点的列表,可以使用该ords方法来获取字符串中所有代码点的a List(技术上是 a )。Positional

\n\n
say "p\xcc\x84".ords;                  # OUTPUT: \xc2\xab(112 772)\xe2\x90\xa4\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以使用uniname方法/例程来获取代码点的 Unicode 名称:

\n\n
.uniname.say for "p\xcc\x84".ords;     # OUTPUT: \xc2\xabLATIN SMALL LETTER P\xe2\x90\xa4COMBINING MACRON\xe2\x90\xa4\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者只是使用uninames方法/例程:

\n\n
.say for "p\xcc\x84".uninames;         # OUTPUT: \xc2\xabLATIN SMALL LETTER P\xe2\x90\xa4COMBINING MACRON\xe2\x90\xa4\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您只想要字符串中的代码点数量,可以使用codes

\n\n
say "p\xcc\x84".codes;                 # OUTPUT: \xc2\xab2\xe2\x90\xa4\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

这与 不同chars,后者仅计算字符串中的字符数:

\n\n
say "p\xcc\x84".chars;                 # OUTPUT: \xc2\xab1\xe2\x90\xa4\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请参阅@hobbs' 使用 的回答NFD

\n