在Perl 6中,可以将波浪号运算符用于嵌套结构。
棘轮运动显然会影响嵌套结构的工作方式。

这种情况不使用棘轮:

$ perl6 -e "say '{hello} aaa }' ~~ / '{' ~ '}' ( .+? ) /"
「{hello}」
 0 => 「hello」


虽然这样做:

$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( .+? ) /"
Nil


通过将.+?模式更改为更具体的<-[}]> +,可以得到我期望的结果:

$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( <-[}]> + ) /"
「{hello}」
 0 => 「hello」


但是我不知道为什么“节俭量词”不能使用棘轮功能工作。
任何想法?

(使用rakudo 2019.03.1)

最佳答案

:ratchet regex adverb禁止引擎回溯到量化的子模式。

第一个/ :r '{' ~ '}' ( .+? ) /模式意味着.+?模式在匹配任何1个或多个字符后(尽可能少),将不会被重新测试,并在随后的模式失败时重新输入。

在这里,以您的{hello} aaa }示例为例,在测试{之后,.+?匹配h,然后}不能匹配e。由于不允许回溯,所以匹配失败并且下一次迭代开始:h被测试用于{,但失败,依此类推。

第二个带有<-[}]> +的正则表达式起作用是因为它匹配除}以外的任何1+个字符,这是与.+?的关键区别,可以匹配}并强制消耗至少1个字符(由于+ )。因此,它不能使用}并找到匹配项。

08-24 17:09