3

在 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");'

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

我想知道为什么不同?

为什么在新版本的 perl 中 un-esixt 和未加载的模块“AXXXXXXXXX”测试通过?

非常感谢 :)

4

2 回答 2

5

perldoc perl5180delta

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

引入此更改是为了修复有关UNIVERSAL::can. 该更改确实会导致可以说是不兼容的行为更改,但根据现有讨论,行为更改不被视为错误并且不太可能被恢复。

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

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

很可能还有另一种方法可以完成您尝试对问题中的代码示例执行的操作。我建议搜索您要完成的任务。

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

no strict 'refs'
unless(@{"${class}::ISA"}) [...]

可能还有另一种方法——再次搜索您想要完成的任务,既然您知道对 Perl 的这种更改。

于 2013-06-27T06:31:41.003 回答
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 中修复

于 2013-06-27T10:49:31.627 回答