何时以及为什么qr()的输出会发生变化?

时间:2013-12-03 10:25:18

标签: regex perl

perl的qr的输出已经发生了变化,显然在版本5.10.1和5.14.2之间有所变化,并且没有记录变更 - 至少没有完全记录。

要演示更改,请在每个版本上执行以下一行:

perl -e 'print qr(foo)is."\n"'

perl 5.10.1-17squeeze6(Debian squeeze)的输出:

(?-xism:foo)

perl 5.14.2-21 + deb7u1(Debian wheezy)的输出:

(?^:foo)

perl文档(perldoc perlop)说:

  

$ rex = qr / my.STRING / is;
  print $ rex; #printed(?si-xm:my.STRING)
  S / $雷克斯/富/;

似乎不再是真的:

$ perl -e 'print qr/my.STRING/is."\n"'
(?^si:my.STRING)

我想知道何时发生此更改(Perl的哪个版本,或支持库或其他)。

一些背景,如果相关:

此更改导致大量单元测试失败。我需要决定是否应该简单地更新单元测试以反映新格式,或者使测试足够动态以支持两种格式等。为了做出明智的决定,我想了解发生变化的原因。了解它发生的时间和地点似乎是开始调查的最佳起点。

3 个答案:

答案 0 :(得分:12)

它记录在perl5140delta

  

正则表达式

     

(?^...)构造表示默认修饰符

     

[...]正则表达式的字符串现在使用这种表示法。 [...]

     

此更改可能会破坏将字符串化的正则表达式与包含?-xism的固定字符串进行比较的代码。

函数regexp_pattern可用于解析修饰符以进行标准化。

答案 1 :(得分:5)

添加这部分原因的部分原因是正则表达式得到了不少新的修饰符。

如果没有发生这种变化,你的例子实际上会产生类似的东西:

(?d-xismpaul:foo)

这也没有真正表达修饰语。

d / u / l只能添加到正则表达式中,而不能像i一样减去。
它们也是相互排斥的。

a / aa此修饰符实际上有两个级别。


虽然正在进行工作添加这些修饰符,但确定这将在CPAN模块上打破相当多的测试。 无论如何看到测试都会破坏,我们同意应该有一种方法来指定只使用默认值(?^:…))。 这样,每次添加新修改器时都不必更新测试。

答案 2 :(得分:-1)

要接收字符串形式的正则表达式,您可以使用Regexp::Parser及其qr方法。使用此模块,您不仅可以测试正则表达式的表示形式,还可以测试树。