我希望嵌套中的代码块只有在整个模式匹配时regex才能执行.
这是我的测试代码.
my regex left {
| a { take "left: 'a' matched" }
| aa { take "left: 'aa' matched" }
}
my regex right { b }
my regex whole {
^
<left>
<right>
$
}
my $string = 'aab';
my @left_history = gather
$string ~~ m:ex/ <whole> /;
.say for @left_history;
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它产生以下输出:
left: 'aa' matched
left: 'a' matched
Run Code Online (Sandbox Code Playgroud)
但我希望它只打印第一行,对应left于成功匹配中使用的值.可能吗?
(当然,据我所知,我可以<left>从$/匹配变量中提取成功的值)
UPD:通常,:ex或者:g产生很多匹配,所以我希望在整个模式的每次成功匹配期间执行嵌套正则表达式中的代码块.
下面的程序修改是基于@raiph非常有用的解释。这不是对原始问题的完全通用的答案,但它解决了我的问题,所以我冒险将其发布为答案。非常欢迎任何更正和改进!
my regex left {
| a { $*left_history = "left: 'a' matched" }
| aa { $*left_history = "left: 'aa' matched" }
| aab { $*left_history = "left: 'aab' matched" }
}
my regex right { b }
my regex whole {
:my $*left_history;
^
<left>
<right>
$
{ take $*left_history }
}
my $string = 'aab';
my @left_history = gather
$string ~~ m:ex/ <whole> /;
.say for @left_history;
Run Code Online (Sandbox Code Playgroud)
输出:
left: 'aa' matched
Run Code Online (Sandbox Code Playgroud)
whole如果变量的范围限制为and会更好left,但我不知道该怎么做。