更新Perl全局变量的正确方法
我在包main中的文件_1.pl中有以下全局in变量:更新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声明变量,否则它将被视
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; }
}