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

Chi*_*ing 3 perl

在perl 5.8中

perl  -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl  -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'
Run Code Online (Sandbox Code Playgroud)

打印"无",表示方法测试失败;

在perl 5.17中

perl  -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl  -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'
Run Code Online (Sandbox Code Playgroud)

打印"a",表示方法测试成功;

我想知道为什么不同?

以及为什么un-esixt和un-loaded模块"AXXXXXXXXX"测试在新版本的perl中传递?

非常感谢 :)

jef*_*eff 5

来自perldoc perl5180delta:

"$ class-> can","$ class-> isa"和"$ class-> DOES"现在返回正确的结果,无论$ class引用的包是否存在[perl#47113].

引入此更改是为了修复有关的长期错误报告UNIVERSAL::can.这种变化确实导致了行为上可以说是不兼容的变化,但基于现有的讨论,行为的变化不会被视为错误而且不可能被还原.

perl#47113记录了原始的bug报告和最近的修复

perl#118513是一个报告你观察到的行为的错误 - 关闭被拒绝

很可能还有另一种方法可以完成您尝试使用问题中的代码示例所做的事情.我建议你搜索一下你想要完成的事情.

如果您正在尝试测试是否加载了特定模块,则可以使用类似于Params :: Validate :: Dependencies采用的方法来响应此更改:

no strict 'refs'
unless(@{"${class}::ISA"}) [...]
Run Code Online (Sandbox Code Playgroud)

可能还有另一种方式 - 再次,搜索你想要完成的事情,现在你已经了解了Perl的这一变化.