在perl 5.8中
perl -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'
打印“无”,表示方法测试失败;
在perl 5.17中
perl -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'
打印“a”,表示方法测试成功;
我想知道为什么不同?
为什么un-esixt和un-loaded模块“AXXXXXXXXX”测试会在新版本的perl中传递?
非常感谢你:)答案 0 :(得分:5)
“$ class-> can”,“$ class-> isa”和“$ class-> DOES”现在返回正确 结果,无论是否由$ class引用的包 存在[perl#47113]。
引入此更改是为了修复有关UNIVERSAL::can
的长期错误报告。这种变化确实会导致行为中存在不兼容的变化,但基于现有的讨论,行为的变化不会被视为错误而且不可能被还原。
perl #47113记录了原始错误报告和最近的修复
perl #118513是一个报告您观察到的行为的错误 - 已被拒绝
很可能还有另一种方法可以完成您尝试对问题中的代码示例执行的操作。我建议你搜索一下你想要完成的事情。
如果您正在尝试测试是否加载了特定模块,则可以使用与the approach adopted by Params::Validate::Dependencies类似的内容来响应此更改:
no strict 'refs'
unless(@{"${class}::ISA"}) [...]
可能有另一种方式 - 再次,搜索你想要完成的事情,现在你知道Perl的这一变化。
答案 1 :(得分:1)
can
有点儿。在您报告时,can
会报告某些模块名称空间没有方法名称isa
。
>perl5.16.3 -E"say 'xxx'->can('isa') ? q{can} : q{can't}"
can't
然而,所有命名空间都有这样的方法。
>perl5.16.3 -E"say eval { 'xxx'->isa('yyy'); 1 } ? q{can} : q{can't}"
can
这是5.18.0中的fixed