gpt4 book ai didi

perl - 使用 Regexp::Grammars (*COMMIT) 做什么?

转载 作者:行者123 更新时间:2023-12-05 01:19:10 26 4
gpt4 key购买 nike

我正在查看 Regexp::Grammars 的示例。该示例在 *COMMIT 周围有一条注释,说明它将如何改进错误消息。我找不到关于 *COMMIT 的任何文档。它有什么作用 ?我在下面包含了部分示例:

    use Regexp::Grammars;
qr{
\A
<Answer>
(*COMMIT) # <-- Remove this to see the error messages get less accurate
(?:
\Z
|
<warning: (?{ "Extra junk after expression at index $INDEX: '$CONTEXT'" })>
<warning: Expected end of input>
<error:>
)

<rule: Answer>
<[_Operand=Mult]>+ % <[_Op=(\+|\-)]>
(?{ $MATCH = shift @{$MATCH{_Operand}};
for my $term (@{$MATCH{_Operand}}) {
my $op = shift @{$MATCH{_Op}};
if ($op eq '+') { $MATCH += $term; }
else { $MATCH -= $term; }
}
})
|
<error: Expected valid arithmetic expression>

最佳答案

(*COMMIT) 记录在 perlre 中.

(*COMMIT) 可用于在其中一个分支在到达特定点后失败时导致整个交替失败。

$ perl -E'
say "$_: ", /
^
(?: a (*COMMIT) b
| c (*COMMIT) d
| . z
)
/sx ?1:0
for qw( ab cd az yz );
'
ab: 1
cd: 1
az: 0
yz: 1

您可以编写以下内容,但在更复杂的示例中编写它可能效率低得多且难度大得多:

/
^
(?: a b
| c d
| [^ac] z
)
/x

关于perl - 使用 Regexp::Grammars (*COMMIT) 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34688845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com