perl5 方法测试 "can"在新版本中无法正常工作

标签 perl

在 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 中通过?

非常感谢:)

最佳答案

来自 perldoc perl5180delta :

"$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/

相关文章:

perl - 如何在 Perl 中发出并行 HTTP 请求,并按顺序接收它们?

perl - 如何在下载失败时不退出?

perl - 在 Perl 的严格模式下使用动态生成的变量名

regex - 为什么 # 字符在 Perl 中被视为 'word' 字符?

perl - 在 Perl 中将文件读入变量

perl - 如何检查对象是否存在

Perl/LibXML : keep closing tags when serializing

bash - 如何随机查找并替换 BASH 文件中仅出现的一个匹配项?

perl 中的 HTML 解析

c++ - 从 C++ 到 Perl