raku - 我可以在 Perl 6 中修改文字正则表达式吗?

标签 raku

假设我们有一个规则的屈折模式,它不能被分割成段。例如。它可以是中缀(在单词中添加一些字母)或元音变化('ablaut')。考虑一个来自德国的例子。

my @words = <Vater Garten Nagel>;
my $search = "/@words.join('|')/".EVAL;

"mein Vater" ~~ $search;                              
say $/;   # 「Vater」

所有三个德语单词都通过将第二个字母“a”更改为“ä”来形成复数形式。所以“Vater”→“Väter”、“Garten”→“Gärten”、“Nagel”→“Nägel”。

有没有办法修改我的$search regex 以便匹配复数形式?
这是我要找的:

my $search_ä = $search.mymethod;
"ihre Väter" ~~ $search_ä;
say $/;  # 「Väter」

当然,我可以修改@words数组并将其“预编译”为新的 regex .但最好(如果可能)修改现有的 regex直接地。

最佳答案

你不能。

正则表达式是 Perl 6 中的代码对象。所以你的问题基本上是“我可以在编写子程序或方法后修改它们吗?”。对于传统代码对象和正则表达式,答案是相同的:不,首先将它们写成你想要的。

也就是说,您实际上并不需要 EVAL对于您的用例。当您在正则表达式中使用数组变量时,它会被插入为替代分支列表,因此您可以编写:
my @words = <Vater Garten Nagel>; my $search = /@words/;
正则表达式 $search变成闭包,所以如果你修改 @words ,你还改什么$search火柴。

此特定示例的另一种方法是使用 :ignoremark修饰符,这使得 a也匹配ä (尽管还有很多其他形式,例如 āǎ 。)

关于raku - 我可以在 Perl 6 中修改文字正则表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46987156/

相关文章:

oop - raku 内置访问器方法可以被子类覆盖吗?

raku - 如何计算Perl 6中整数的交替数字和?

raku - 刷新预编译的 perl6 模块的最佳方法是什么?

raku - raku 角色中的签名限制

raku - 为什么创建 GTK 应用程序会导致依赖错误?

raku - 如何在 Perl 6 中卸载模块?

scope - 在子中通过名称获取符号的值

string - 将字符串拆分为固定长度的 block 并在 Raku 中写在单独的行中

raku - 需要在 Raku 中的每 n 行读取文本文件的建议

raku - 如何检查数组的所有元素是否在 Perl 6 中定义?