第 19 篇把 \A(a+)+\z 和 \Aa+\z 放在短输入末尾追加 X 的拒绝场景中对照。选修复跑仅取 6、8、10 个 a:两个模式都拒绝,程序打印组合分割数 32、128、512。这个数来自数学上的 2 ** (size - 1),不是 Perl 引擎实测尝试次数、耗时曲线,更不能由一次执行推出任意长输入的复杂度。对抗样本被刻意限在 10 个 a 以内。

另一个反例更可直接观测:在 aXb a.b 中把动态字面数据 a.b 不加引号地插入正则,. 会匹配 X,得到 unquoted=aXb;使用 \Q$needle\E 才得到 literal=a.b。动态模式若来自用户输入,不应该无条件当作正则语法。正例是受限样本全部拒绝且程序有界完成,反例是未经转义时误匹配,两者在 experiments/16-20-patterns.pl 分别可重跑。

练习:为了“证明”回溯严重性,把输入从 10 个 a 改成 100 万个再计时是否合理?不合理:执行可能没有受控时间边界,单次耗时也不构成复杂度证明。想论证引擎行为,需要版本明确、隔离资源、设计输入规模和重复测量,避免把推导的分割数冒充测得的状态数。命令、成功/反例的 stdout 与 status 见 examples/perl-language/evidence/E01-E08.md;参考 5.38.2 pod/perlre.pod、pod/perlrebackslash.pod。