更新Perl全局变量的正确方法

时间:2012-04-05 11:19:33

标签: perl scope global-variables

我在file_1.pl中有以下全局变量,在包main中:

package main;

my $var = -1;

如果我需要从另一个perl文件更新此变量,那么这样做的方法是什么?我试过了:

$main::var = 1

但它不起作用。

这样做的正确方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:8)

my是一个词法变量。它的范围是它的块,或者,如果不是块,则是文件。在他们的范围之外不能看到它们。

您可以创建一个全局变量,正如其他答案所示:

our $var;

但是,更好的方法是为代码的其他部分提供更新词法版本的接口:

my $private;

sub set_private { $private = shift }

但是,如果你打算这样做,你也可以拥有一个获取价值的界面。现在该变量只需要与使用它的子例程在同一范围内,因此您可以将其隐藏在文件的其余部分中:

{
my $private;
sub set_private { $private = shift }

sub get_private { $private }
}

现在你距离一个物体只有一步之遥(在这种情况下,是一个单身人士):

use v5.12;

package Foo {
    my $private;
    sub new { bless \$private, shift }
    sub set { my $self = shift; $$self = shift; }

    sub get { my $self = shift; $$self; }
    }

答案 1 :(得分:3)

你必须用our声明变量,否则它将被视为 lexical 变量,所以改变它就像

our $var = -1; 

答案 2 :(得分:1)

您可以创建包装函数。

在主档

our $var;
sub updateGlobal {
   $var = shift;
}

在另一个文件中只需调用一个函数

updateGlobal(1);