我们在Perl程序中何时需要?

时间:2016-11-19 18:12:33

标签: perl variables

似乎只需要我们的来暴露包中的(全局)变量。在其他情况下,它的使用仅有助于提高可读性,但不是必需的。

如果上述观察是正确的,那么通过遵循封装的做法,它甚至不需要在包中,因为将使用 my ,并且将提供getter和setter。

假设我的应用程序可以完全使用OOD实现,并且在一个包中,数据严格地使用args传递给子例程,那么我是否完全不需要我们的

2 个答案:

答案 0 :(得分:3)

在......

时使用our
  1. 您需要使用全局变量。
  2. 您想使用local(您可能不应该这样做)。
  3. 一般来说,你是正确的, 你可能做的任何事情,因为全局变量可以通过类方法访问器完成,获得封装的所有优点

    例如......

    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,您将收到与上述相同的警告。