Perl 当sub-Foo::bar{}和sub-bar{}都属于包Foo时,它们之间的区别是什么?

Perl 当sub-Foo::bar{}和sub-bar{}都属于包Foo时,它们之间的区别是什么?,perl,Perl,假设我们有这样的代码 package Foo; sub bar { say 'hi'; } 还有这个 package Foo; sub Foo::bar { say 'hi'; } 我认为它们是等价的,所以我们可以这样做 Foo->bar(); 无论我们是否用完全限定名定义方法。然而,在某些情况下,它们确实是不同的。例如,在perldoc-f require给出的示例中,方法INC必须使用包名完全限定: # In Foo.pm package Foo; sub new

假设我们有这样的代码

package Foo;
sub bar {
    say 'hi';
}
还有这个

package Foo;
sub Foo::bar {
    say 'hi';
}
我认为它们是等价的,所以我们可以这样做

Foo->bar();
无论我们是否用完全限定名定义方法。然而,在某些情况下,它们确实是不同的。例如,在
perldoc-f require
给出的示例中,方法
INC
必须使用包名完全限定:

# In Foo.pm
package Foo;
sub new { ... }
sub Foo::INC {
    my ($self, $filename) = @_;
    ...
}
# In the main program
push @INC, Foo->new(...);

如果我们没有完全限定方法名,则会发生编译时错误。那么,完整限定名和没有前置包名之间有什么区别呢?

perldoc-f require
说明了原因:

如果钩子是一个对象,它必须提供一个INC方法,该方法将被如上所述调用,第一个参数是对象本身。(请注意,您必须完全限定sub的名称,因为不合格的“INC”总是强制进入包“main”。)


因此,如果不使用包限定符,就好像编写了
submain::INC{}
。我不能告诉你为什么会发生这种情况,但我猜这是解释器中的一种特殊情况。

导致
@main::INC
作为
@INC
全局可访问的机制也导致
sub INC{}
意味着
sub main::INC{}

引述

以数字、控制字符或标点字符开头的Perl标识符不受
声明的影响,并且始终强制位于包
中;它们也可以免除
严格的“vars”
错误。其他一些名称也可以通过以下方式获得豁免:

ENV STDIN
INC STDOUT
ARGV STDERR
ARGVOUT
SIG

如果我们没有完全限定方法名,则会发生编译时错误

哼。。。它不会执行您想要的操作,但也不会导致编译时错误

$ perl -ce'
    package Foo;
    sub new { ... }
    sub INC {
        my ($self, $filename) = @_;
        ...
    }

    push @INC, Foo->new("...");
'
-e syntax OK

请原谅我的编辑。我本想补充你的答案,但我收回了它,因为你引用的段落与需要限定的原因无关。我遇到的编译时错误可能是由于加载所需的模块失败。