在 perl 中,$self->subname 与 $self->MYPACKAGE::subname 相同吗?

sno*_*yjc 2 perl

在 Perl 中,与$self->subname相同吗$self->MYPACKAGE::subname我是Pythonizer的作者,还有另一段神秘的 Perl 代码,这个代码又来自 CGI.pm。这里的代码采用$self,它是 CGI 包的实例变量,然后调用hidden其中定义的函数,但代码不只是使用$self->hidden(...),它还使用$self->CGI::hidden(...). 当我将其转换为 Python 时self.CGI.hidden(...),我收到一条错误消息,指出 CGI 类没有 CGI 属性。我想知道在这种情况下是否应该创建一个仅指向类实例的 CGI 属性(或者应该指向该类)?无论如何,这到底意味着什么?

package CGI;
...
sub hidden { ... }
...
$self->CGI::hidden(...);
Run Code Online (Sandbox Code Playgroud)

Ste*_*ich 5

在perl中,$self->subname与$self->MYPACKAGE::subname相同

不。

$self->subnamesubname将在与 object 关联的符号表中查找$self,这是来自被祝福的包的符号表$self

$self->MYPACKAGE::subname相反,大部分(但不完全是 - 请参阅下面来自 tobyink 的评论)类似于调用MYPACKAGE::subname($self),即它不会在与 关联的符号表中查找方法$self,而是在MYPACKAGE(及其父包)的符号表中查找。$self可能连方法都没有subname

  • `$self->MYPACKAGE::subname` 和 `MYPACKAGE::subname($self)` 实际上有点不同。前者将尊重继承,如果 MYPACKAGE 没有该名称的子目录,则搜索 MYPACKAGE 的父级。 (4认同)