当它们都属于包Foo时,sub Foo :: bar {}和子条{}之间有什么区别?

Cod*_*ody 8 perl

假设我们有这样的代码

package Foo;
sub bar {
    say 'hi';
}
Run Code Online (Sandbox Code Playgroud)

还有这个

package Foo;
sub Foo::bar {
    say 'hi';
}
Run Code Online (Sandbox Code Playgroud)

我认为它们是等价的,所以我们可以做到这一点

Foo->bar();
Run Code Online (Sandbox Code Playgroud)

我们是否使用完全限定名称定义方法.但是,在某些情况下,它们确实不同.例如,在给定的示例中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(...);
Run Code Online (Sandbox Code Playgroud)

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

ike*_*ami 6

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

引用perlvar,

以数字,控制字符或标点字符开头的Perl标识符不受package声明的影响,并且总是被强制包装main; 他们也免于strict 'vars'错误.其他一些名字也可以通过以下方式获得豁免:

ENV STDIN
INC STDOUT
ARGV STDERR
ARGVOUT
SIG
Run Code Online (Sandbox Code Playgroud)

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

哼...它不会做你想要的,但它也不会导致编译时错误.

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

    push @INC, Foo->new("...");
'
-e syntax OK
Run Code Online (Sandbox Code Playgroud)