仅当Perl 6

时间:2017-11-02 14:01:02

标签: regex perl6

如果整个模式匹配,我希望嵌套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;

正如所料,它产生以下输出:

left: 'aa' matched
left: 'a' matched

但我希望它只打印第1行,对应于成功匹配中使用的left的值。有可能吗?

(当然,我了解我可以从<left>匹配变量中提取$/的成功值)

UPD:通常,:ex:g会产生很多匹配,因此我希望在每次成功期间执行嵌套式正则表达式中的代码块整个模式的匹配。

1 个答案:

答案 0 :(得分:3)

该程序的以下修改基于@ 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;

输出:

left: 'aa' matched

如果变量的范围仅限于wholeleft,那会更好,但我不知道该怎么做。