假设我们有一个规则的屈折模式,它不能被分割成段。例如。它可以是中缀(在单词中添加一些字母)或元音变化('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/