似乎只需要我们的来暴露包中的(全局)变量。在其他情况下,它的使用仅有助于提高可读性,但不是必需的。
如果上述观察是正确的,那么通过遵循封装的做法,它甚至不需要在包中,因为将使用 my ,并且将提供getter和setter。
假设我的应用程序可以完全使用OOD实现,并且在一个包中,数据严格地使用args传递给子例程,那么我是否完全不需要我们的?
答案 0 :(得分:3)
our
local
(您可能不应该这样做)。一般来说,你是正确的, 你可能做的任何事情,因为全局变量可以通过类方法访问器完成,获得封装的所有优点 。
例如......
package Foo;
use strict;
use warnings;
our $Thing = 42;
与...相比。
package Foo;
use strict;
use warnings;
sub thing { 42 }
如果$Foo::Thing
不再是简单常量,会发生什么?如果计算成本很高并且很少使用,会怎么样?通过使用Foo->thing
封装,您只能在需要时进行计算。
它还允许子类覆盖类信息。
package Bar;
our @ISA = qw(Foo);
sub thing { 23 }
这使我们何时使用our
:何时需要。有很多Perl功能和库可以通过约定或实现来读取全局变量。最常见的示例是@ISA
,用于子类化,$VERSION
,以及Exporter变量的沙拉,例如@EXPORT
。
有更好的方法可以做到这一点,并且像Exporter这样的许多模块都有替代品,但是当Perl 5对OO感到不舒服时,许多这些约定都被规定了。
最后一次使用our
,这是为了利用local
。它可用于在不更改功能签名的情况下传递额外数据。当函数退出时,原始值将自动恢复。
our $foo;
sub something {
...do something involving $foo and set $stuff...
local $foo = $stuff;
something();
}
是的,这是一个糟糕的例子。
这种情况有用且可取的情况再次表明设计不良。通常它用于在函数之间传递额外的数据而不改变它们的签名,通常作为递归的一部分。 File :: Find充斥着这种技术。运行perldoc -m File::Find
并四处寻找。
答案 1 :(得分:2)
在某些情况下需要它,例如从您不需要/不能使用吸气剂的其他位置访问类变量:
package Package;
our $VERSION = '0.01';
1;
现在:
perl -wMstrict -MPackage -E 'say $Package::VERSION'
0.01
如果使用$VERSION
声明my
变量:
Use of uninitialized value $Package::VERSION in say at -e line 1.
也就是说,变量在包名称空间本身之外是不可见的,因为在使用my
时,它对包本身是词法的,即。它只在包装范围内。
如果要导出变量,还必须使用our
:
package Package;
use Exporter;
our @ISA = 'Exporter';
our @EXPORT = qw($x);
our $x = 10;
1;
这将打印10:
perl -wMstrict -MPackage -E 'say $x'
...但是使用my
,您将收到与上述相同的警告。