For*_*ang 4 perl scope subroutine
我有一个奇怪的表现(对Python程序员)子程序,其简化如下:
use strict;
use Data::Dumper;
sub a {
my @x;
sub b { push @x, 1; print "inside: ", Dumper(\@x); }
&b;
print "outside: ", Dumper(\@x);
}
&a;
&a;
Run Code Online (Sandbox Code Playgroud)
我发现结果是:
inside: $VAR1=[ 1 ]
outside: $VAR1 = [ 1 ]
inside: $VAR1=[1, 1]
outside: $VAR1= []
Run Code Online (Sandbox Code Playgroud)
我还以为是打电话时&a,@x是空数组后" my @x"之后有一个元素" &b",然后死了.我每次打电话&a都是一样的.所以输出应该是全部$VAR1 = [ 1 ].
然后我读了一些像命名子例程在符号表中定义一次,然后我做" my $b = sub { ... }; &$b;",这对我来说似乎有意义.
如何解释?
K. *_*uhr 12
根据"perlref"手册页:
命名子例程是在编译时创建的,因此它们的词汇变量[即,它们的'my'变量]从第一次执行父块时被分配给父词汇.如果第二次输入父作用域,则会再次创建其词法,而嵌套的子作用仍然引用旧的作用域.
换句话说,一个命名子例程(你的b),它@x绑定到父子例程的"first" @x,所以当a第一次调用时,b添加一个1to @x,内部和外部副本都引用同一个版本.然而,第二次a调用时,@x会创建一个新的词法,但b仍指向旧的词法,因此它会1在该列表中添加第二个并打印它(内部),但是当a需要打印其版本时,它会打印出来出(空)全新的词汇(外).
匿名子程序不会出现这个问题,所以在你写的时候my $b = sub { ... },内部@x总是指的是a'词汇的"当前"版本@x.