的正确方法,我有以下在file_1.pl可变全球,在包主:更新一个Perl的全局变量
package main;
my $var = -1;
如果我需要从另一个perl的文件更新这个变量,有什么办法做到这一点?我试过了:
$main::var = 1
但它没有奏效。
这样做的正确方法是什么?
谢谢!
的正确方法,我有以下在file_1.pl可变全球,在包主:更新一个Perl的全局变量
package main;
my $var = -1;
如果我需要从另一个perl的文件更新这个变量,有什么办法做到这一点?我试过了:
$main::var = 1
但它没有奏效。
这样做的正确方法是什么?
谢谢!
您必须声明与our
否则将被视为词法可变的变量,因此改变像
our $var = -1;
您可以创建一个包装函数。
在主文件
our $var;
sub updateGlobal {
$var = shift;
}
在其他文件只需要调用一个函数
updateGlobal(1);
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的详细答案。 – Izza 2012-04-06 14:46:28
可以请扩展为什么downvote? – 2012-04-05 11:50:35
我只是猜测,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
也许,从术语。 “局部变量”意味着与“本地”功能有关。词汇变量与“本地”无关。 – 2012-04-05 13:18:30