加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

仅当Perl 6中的整个匹配成功时,才在嵌套的正则表达式中执行代码

发布时间:2020-12-15 21:44:42 所属栏目:大数据 来源:网络整理
导读:我希望只有在整个模式匹配时才能执行嵌套正则表达式中的代码块. 这是我的测试代码. 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 @le
我希望只有在整个模式匹配时才能执行嵌套正则表达式中的代码块.

这是我的测试代码.

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

但我希望它只打印第一行,对应于成功匹配中使用的左值.可能吗?

(当然,我知道我可以从$/ match变量中提取< 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;

输出:

left: 'aa' matched

如果变量的范围将被限制为整体和左边,那会更好,但我不知道该怎么做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读