假设我们有一个常规的屈折模式,不能分割成段。例如。它可以是中缀(在单词中添加一些字母)或元音更改('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
正则表达式,以便它匹配复数形式?
这就是我要找的东西:
my $search_ä = $search.mymethod;
"ihre Väter" ~~ $search_ä;
say $/; # 「Väter」
当然,我可以修改@words
数组并将其“预编译”为新的regex
。但最好(如果可能的话)直接修改现有的regex
。
答案 0 :(得分:7)
你不能。
正则表达式是Perl 6中的代码对象。因此,您的问题基本上是“我可以在编写子程序后修改子程序或方法吗?”。对于传统的代码对象和正则表达式,答案是相同的:不,首先将它们写在你想要的位置。
那就是说,你的用例实际上并不需要EVAL
。在正则表达式中使用数组变量时,它会作为替代分支的列表进行插值,因此您只需编写:
my @words = <Vater Garten Nagel>;
my $search = /@words/;
正则表达式$search
成为闭包,因此如果您修改@words
,则还会更改$search
匹配的内容。
此特定示例的另一种方法是使用:ignoremark
修饰符,这使得a
也匹配ä
(尽管还有许多其他形式,例如ā
或ǎ
。)