假设我们有这样的代码
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)
如果我们没有完全限定方法名称,则会发生编译时错误.那么,完全限定名称和没有包名称之间的区别是什么?
导致@main::INC全球可访问的机制@INC也sub INC { }意味着sub main::INC { }.
引用perlvar,
以数字,控制字符或标点字符开头的Perl标识符不受
package声明的影响,并且总是被强制包装main; 他们也免于strict 'vars'错误.其他一些名字也可以通过以下方式获得豁免:Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)