我可以修改 Perl 6 中的文字正则表达式吗?
Can I modify a literal regex in Perl 6?
假设我们有一个规则的屈折模式,它不能被分割成片段。例如。它可以是中缀(在单词中添加一些字母)或元音变化('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
数组,'precompile'改成新的regex
。但是最好(如果可能的话)直接修改现有的regex
。
你不能。
正则表达式是 Perl 6 中的代码对象。因此您的问题基本上是 "Can I modify subroutines or methods after I've written them?"。对于传统代码对象和正则表达式,答案是相同的:不,首先将它们写成你想要的。
也就是说,您的用例实际上不需要 EVAL
。当您在正则表达式中使用数组变量时,它被插入为替代分支列表,因此您可以只写:
my @words = <Vater Garten Nagel>;
my $search = /@words/;
正则表达式 $search
成为闭包,因此如果您修改 @words
,您也会更改 $search
匹配的内容。
这个特定示例的另一种方法是使用 :ignoremark
修饰符,这使得 a
也匹配 ä
(尽管还有很多其他形式,例如 ā
或 ǎ
.)
假设我们有一个规则的屈折模式,它不能被分割成片段。例如。它可以是中缀(在单词中添加一些字母)或元音变化('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
数组,'precompile'改成新的regex
。但是最好(如果可能的话)直接修改现有的regex
。
你不能。
正则表达式是 Perl 6 中的代码对象。因此您的问题基本上是 "Can I modify subroutines or methods after I've written them?"。对于传统代码对象和正则表达式,答案是相同的:不,首先将它们写成你想要的。
也就是说,您的用例实际上不需要 EVAL
。当您在正则表达式中使用数组变量时,它被插入为替代分支列表,因此您可以只写:
my @words = <Vater Garten Nagel>;
my $search = /@words/;
正则表达式 $search
成为闭包,因此如果您修改 @words
,您也会更改 $search
匹配的内容。
这个特定示例的另一种方法是使用 :ignoremark
修饰符,这使得 a
也匹配 ä
(尽管还有很多其他形式,例如 ā
或 ǎ
.)