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

更新Perl全局变量的正确方法,perl,scope,global-variables,Perl,Scope,Global Variables,我在包main中的文件_1.pl中有以下全局in变量: package main; my $var = -1; 如果我需要从另一个perl文件更新这个变量,该怎么做?我试过: $main::var = 1 但它没有起作用 正确的做法是什么 谢谢大家! 您可以创建一个包装函数 在主文件中 our $var; sub updateGlobal { $var = shift; } 在另一个文件中,只需调用一个函数 updateGlobal(1); 您必须使用our声明变量,否则它将被视

我在包main中的文件_1.pl中有以下全局in变量:

package main;

my $var = -1;
如果我需要从另一个perl文件更新这个变量,该怎么做?我试过:

$main::var = 1
但它没有起作用

正确的做法是什么


谢谢大家!

您可以创建一个包装函数

在主文件中

our $var;
sub updateGlobal {
   $var = shift;
}
在另一个文件中,只需调用一个函数

updateGlobal(1);

您必须使用
our
声明变量,否则它将被视为词法变量,因此需要进行如下更改

our $var = -1; 

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

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

our $var;
但是,更好的方法是为代码的其他部分提供一个更新词汇版本的接口:

my $private;

sub set_private { $private = shift }
但是,如果要这样做,还可以使用一个接口来获取值。现在,该变量只需要与使用它的子例程位于同一范围内,这样您就可以对文件的其余部分隐藏它:

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

sub get_private { $private }
}
现在,您离对象仅一步之遥(在本例中为单体):


我只是猜测否决票是因为问题使用了“正确的方式”,你刚刚向他展示了全局语言是如何在Perl中实现的,当FAQ ish的“正确答案”是1)尽可能使用词汇时,2)检查词汇是否符合你的目的,3)使用包方法,如下面Brian的答案中所示,4)如果不能执行其他操作,请将它们设置在尽可能本地的范围内<代码>{local$PackageVar=-1;用_PackageVar()做点什么}#这里$PackageVar是未设置的。也可能是从术语上来说。“局部变量”意味着与“局部”函数有关。词法变量与“局部变量”无关。@Axeman,@davorg:这可能就是原因,我应该使用正确的术语,即词法变量而不是局部变量。感谢
我们的
为全局变量创建了一个词法别名。
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; }
    }