假设我们有一个规则的屈折模式,不能分割成段.例如,它可以是中缀(在单词内添加一些字母)或元音更改('ablaut').考虑德国人的一个例子.
my @words = <Vater Garten Nagel>;
my $search = "/@words.join('|')/".EVAL;
"mein Vater" ~~ $search;
say $/; # ?Vater?
Run Code Online (Sandbox Code Playgroud)
所有三个德语单词都通过将第二个字母'a'更改为'ä'而形成复数.所以'Vater'→'Väter','Garten'→'Gärten','Nagel'→'Nägel'.
有没有办法修改我的$search正则表达式,以便它匹配复数形式?这是我正在寻找的:
my $search_ä = $search.mymethod;
"ihre Väter" ~~ $search_ä;
say $/; # ?Väter?
Run Code Online (Sandbox Code Playgroud)
当然,我可以修改@words数组并将其"预编译"成新的regex.但最好(如果可能的话)regex直接修改现有的.
你不能.
正则表达式是Perl 6中的代码对象.因此,您的问题基本上是"我可以在编写子程序后修改子程序或方法吗?".对于传统的代码对象和正则表达式,答案是相同的:不,首先将它们写入您想要的对象.
也就是说,您实际上并不需要EVAL您的用例.在正则表达式中使用数组变量时,它会作为替代分支的列表进行插值,因此您只需编写:
my @words = <Vater Garten Nagel>;
my $search = /@words/;
正则表达式$search成为一个闭包,所以如果你修改@words,你也可以改变$search匹配.
这个特定示例的另一种方法是使用:ignoremark修饰符,它a也匹配ä(尽管还有很多其他形式,例如?或?.)
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |