Perl中ref qr/.../的返回值是否可能不为Regexp?
你提到的“大概率”表述确实是在暗示ref qr/.../存在返回Regexp以外值的可能,主要有以下两类场景:
- 人为修改正则对象的bless包
qr//生成的正则对象本质是已经被bless到Regexp命名空间的引用,而Perl允许对已bless的引用二次修改绑定的命名空间,你可以手动把正则对象bless到任意自定义包,此时ref的返回值就会变成自定义包名,示例代码如下:my $origin_re = qr/hello world/; print ref $origin_re; # 无特殊操作时输出 Regexp bless $origin_re, 'Custom::RegexpWrapper'; print ref $origin_re; # 此时输出 Custom::RegexpWrapper - 第三方模块的自动封装
不少做正则增强、校验规则封装的第三方库,会自动把生成的正则对象重bless到库自定义的命名空间实现功能扩展,这种场景下即使你没有手动操作,ref返回的结果也可能不是默认的Regexp。
如果没有做上述特殊操作,也没有引入会修改正则对象bless包的依赖,ref qr/.../的返回值会稳定为Regexp,官方文档的“大概率”只是为了表述严谨,排除极端特殊场景的例外情况。
内容的提问来源于stack exchange,提问作者sid_com
相关产品推荐
相关产品推荐

