假设我们有这样的代码
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(...);如果我们没有完全限定方法名,那么就会发生编译时错误。那么,完全限定名和不加包名之间有什么区别呢?
发布于 2014-07-22 13:41:37
使@main::INC成为全局可访问的@INC的机制也会导致sub INC { }表示sub main::INC { }。
引用珀尔瓦,
以数字、控制字符或标点符号开头的Perl标识符不受
package声明的影响,并且总是被迫在包main中;它们也不受strict 'vars'错误的影响。其他几个名字也可以通过以下方式获得豁免: STDIN公司STDOUT ARGV STDERR ARGVOUT SIG如果我们没有完全限定方法名,那么就会发生编译时错误。
哼..。它不会做您想做的事情,但也不会导致编译时错误。
$ perl -ce'
package Foo;
sub new { ... }
sub INC {
my ($self, $filename) = @_;
...
}
push @INC, Foo->new("...");
'
-e syntax OK发布于 2014-07-22 13:10:06
perldoc -f require说明了为什么会这样:
如果钩子是一个对象,它必须提供一个INC方法,该方法将按上面的方式调用,第一个参数是对象本身。(请注意,您必须完全限定潜艇的名称,因为不合格的"INC“总是被强制放入包”main“中。)
因此,如果不使用包限定符,就会像编写sub main::INC {}一样。我不能告诉你为什么会这样,但我猜这是翻译中的特例之一。
https://stackoverflow.com/questions/24883095
复制相似问题