Perl 如何更改子例程中的变量?
下面的代码Perl 如何更改子例程中的变量?,perl,scope,Perl,Scope,下面的代码 use strict; my $var = new(); foreach (1..3){ print $var->{val},"\t",$var->{inc}(),"\n"; } sub new{ my $foo = 0; return { val => $foo, inc => sub { # do something with $foo
use strict;
my $var = new();
foreach (1..3){
print $var->{val},"\t",$var->{inc}(),"\n";
}
sub new{
my $foo = 0;
return {
val => $foo,
inc => sub {
# do something with $foo
$foo++;
}
};
}
给出的输出:
0 0
0 1
0 2
因此,我们不能通过设置
$var{val}
来更改子例程$var{inc}
内部的$foo
。有没有办法做到这一点?很可能有一个my$foo
变量在同一范围内分裂成两个不同的实体(?)在这个程序中,my$foo
在范围和持续时间方面发生了什么?您需要在hashref中存储对$foo的引用,即val=>\$foo
。目前您只存储了该值,因此不会对其进行更新
在访问时一定要取消对它的引用,例如,
print${$var->{val}}
为什么不同时使用函数来读取变量,val=>sub{$foo}
想想perlref
中说的话:闭包并不是大多数Perl程序员一开始就需要麻烦的事情。