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

Fli*_*mzy 5 regex perl

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

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

perl -e 'print qr(foo)is."\n"'
Run Code Online (Sandbox Code Playgroud)

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

(?-xism:foo)
Run Code Online (Sandbox Code Playgroud)

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

(?^:foo)
Run Code Online (Sandbox Code Playgroud)

perl文档(perldoc perlop)说:

$ rex = qr/my.STRING /是;
print $ rex; #printing(?si-xm:my.STRING)
s/$ rex/foo /;

这似乎不再是真的:

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

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

一些背景,如果相关:

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

tob*_*ink 12

它记录在perl5140delta:

常用表达

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

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

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

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


Bra*_*ert 5

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

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

(?d-xismpaul:foo)
Run Code Online (Sandbox Code Playgroud)

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

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

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


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