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的哪个版本,或支持库或其他)。
一些背景,如果相关:
此更改导致大量单元测试失败。我需要决定是否应该简单地更新单元测试以反映新格式,或者使测试足够动态以支持两种格式等。为了做出明智的决定,我想了解发生变化的原因。了解它发生的时间和地点似乎是开始调查的最佳起点。
答案 0 :(得分:12)
它记录在perl5140delta
:
正则表达式
(?^...)
构造表示默认修饰符[...]正则表达式的字符串现在使用这种表示法。 [...]
此更改可能会破坏将字符串化的正则表达式与包含
?-xism
的固定字符串进行比较的代码。
函数regexp_pattern
可用于解析修饰符以进行标准化。
答案 1 :(得分:5)
添加这部分原因的部分原因是正则表达式得到了不少新的修饰符。
如果没有发生这种变化,你的例子实际上会产生类似的东西:
(?d-xismpaul:foo)
这也没有真正表达修饰语。
d
/ u
/ l
只能添加到正则表达式中,而不能像i
一样减去。
它们也是相互排斥的。
a
/ aa
此修饰符实际上有两个级别。
虽然正在进行工作添加这些修饰符,但确定这将在CPAN模块上打破相当多的测试。
无论如何看到测试都会破坏,我们同意应该有一种方法来指定只使用默认值((?^:…)
)。
这样,每次添加新修改器时都不必更新测试。
答案 2 :(得分:-1)
要接收字符串形式的正则表达式,您可以使用Regexp::Parser及其qr
方法。使用此模块,您不仅可以测试正则表达式的表示形式,还可以测试树。