2014-07-22 81 views
8

假设我们有这样的当sub Foo :: bar {}和sub bar {}属于Foo包时,它们有什么区别?

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(...); 

如果我们不完全限定的方法名,则发生编译时错误。那么,全限定名和预先没有包名之间有什么区别?

回答

6

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

报价perlvar

与数字,控制字符,或标点字符开始是从package声明的效果豁免和总是被迫要在包main Perl的标识符;他们也免除了strict '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 
+0

我遇到的编译时错误可能来自加载所需模块的失败。 – Cody

2

perldoc -f require状态为什么会这样:

如果钩子是一个对象,它必须提供一个INC方法将被如上述调用时,第一参数是对象本身。 (请注意,您必须完全限定子的名字,如不合格“INC”总是被迫进入包“主”)。

因此这将是,如果你写了sub main::INC {},如果你假包预选赛了。我无法告诉你为什么会发生这种情况,但我的猜测是这是翻译中的特例之一。

+0

请原谅我的编辑。我将增加你的答案,但我撤回了它,因为你引用的段落与'sub Foo :: INC'需要合格的原因无关。 – ikegami

相关问题