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

 吴振华0575_762 发布于 2023-02-13 11:38

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 /是;
print $ rex; #printing(?si-xm:my.STRING)
s/$ rex/foo /;

这似乎不再是真的:

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

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

一些背景,如果相关:

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

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

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

    (?d-xismpaul:foo)
    

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

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

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


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

    2023-02-13 11:41 回答
  • 它记录在perl5140delta:

    常用表达

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

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

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

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

    2023-02-13 11:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有