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