2012-04-05 153 views
2

的正确方法,我有以下在file_1.pl可变全球,在包主:更新一个Perl的全局变量

package main; 

my $var = -1; 

如果我需要从另一个perl的文件更新这个变量,有什么办法做到这一点?我试过了:

$main::var = 1 

但它没有奏效。

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

谢谢!

回答

3

您必须声明与our否则将被视为词法可变的变量,因此改变像

our $var = -1; 
+0

可以请扩展为什么downvote? – 2012-04-05 11:50:35

+2

我只是猜测,downvote来自于这个问题使用了“正确的方式”这个词,你只是在Perl中向他展示了全局变量*完成*,当FAQ-ish“正确答案”是1)使用词法只要有可能,2)检查并看看一个词汇*是否能够符合你的目的,3)使用包装方法,就像在下面的Brian的回答中一样,4)如果你不能做其他事情,尽可能将它们设置为* local *范围。 '{local $ PackageVar = -1; do_something_with_PackageVar(); }#在这里$ PackageVar未设置。# – Axeman 2012-04-05 12:45:34

+1

也许,从术语。 “局部变量”意味着与“本地”功能有关。词汇变量与“本地”无关。 – 2012-04-05 13:18:30

1

您可以创建一个包装函数。

在主文件

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

在其他文件只需要调用一个函数

updateGlobal(1); 
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; } 
    } 
+0

+1的详细答案。 – Izza 2012-04-06 14:46:28