Perl 正则表达式引擎的(回溯)实现从根本上与作为行尾的用法不兼容。这个问题的一部分是你不想在读取下一个字符时重新运行整个正则表达式。例如,采用正则表达式
$/ = qr/ A \w*? B | XY/;
和数据流
f o o A 1 2 X Y B b a r
那么什么时候应该readline
退货呢?如果我们进行增量匹配,我们可能会得到类似
f o o A 1 2 X Y B b a r
A\w\w\w\w B
#=> fooA12XYB
如果我们在每个位置重新运行整个正则表达式,我们得到
f o o A 1 2 X Y B b a r
A *FAIL
*FAIL
A\w *FAIL
*FAIL
A\w\w *FAIL
*FAIL
A\w\w\w *FAIL
X *FAIL
A\w\w\w\w *FAIL
X Y
#=> fooA12XY
换句话说,交替(优先)使这种匹配变得复杂。如果正则表达式引擎没有回溯(而是作为表解析器或状态机运行),则重新运行整个正则表达式或进行增量匹配之间没有区别。但是,可能的正则表达式引擎不如 Perl 正则表达式的表现力。
另一个问题是行尾
$/ = qr/ .+ /xs;
读取这样的“行”应该只返回下一个字符(因为正则表达式在一个字符之后已经满足),还是整个文件(因为.*
想要尽可能匹配)?还是应该返回内部缓冲区的其余部分,无论它当前包含什么?
要将正则表达式用于行尾,必须解决这些歧义,并且必须施加额外的限制(例如,只允许使用常规语言)。