Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何更改子例程中的变量?_Perl_Scope - Fatal编程技术网

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程序员一开始就需要麻烦的事情。