在 perl 5.8 中
perl -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'
print "nothing",表示方法测试失败;
在 perl 5.17 中
perl -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'
打印“a”,表示方法测试成功;
我想知道为什么不同?
为什么 un-esixt 和卸载模块“AXXXXXXXXX”测试在新版本的 perl 中通过?
非常感谢:)
最佳答案
"$class->can", "$class->isa", and "$class->DOES" now return correct results, regardless of whether that package referred to by $class exists [perl #47113].
引入此更改是为了修复关于 UNIVERSAL::can
的长期开放错误报告。该更改确实会导致可以说是不兼容的行为更改,但根据现有讨论,行为更改不被视为错误并且不太可能恢复。
perl #47113记录原始错误报告和最近的修复
perl #118513是报告您观察到的行为的错误 -- 已拒绝关闭
很可能还有另一种方法可以完成您尝试使用问题中的代码示例执行的操作。我建议搜索您要完成的任务。
如果你想测试一个特定的模块是否被加载,你可以使用类似于the approach adopted by Params::Validate::Dependencies 的东西。响应此更改:
no strict 'refs'
unless(@{"${class}::ISA"}) [...]
可能还有另一种方法——同样,搜索您要完成的目标,既然您知道 Perl 的这一变化。
关于perl5 方法测试 "can"在新版本中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17334426/