sub fun2{
my $var2 = 10;
my sub fun1{
print"$var2";
$var2++;
}
fun1();
print "$var2";
}
fun2();
我想打印10和11,此代码给出错误“在source_file上未启用实验性“ my”子”,如果从“ my sub fun1”中删除“ my”关键字,则给出错误“ Variable“ $ var2”将不会在source_file.pl行保持共享状态” 我们如何允许内部子对象修改外部子对象的数据?
谢谢
答案 0 :(得分:5)
用词命名的子例程在Perl中仍处于(非常)试验阶段。一种简单的方法是改用匿名子例程,这样可以避免丢失共享变量而又不进行实验的问题:
sub fun2{
my $var2 = 10;
my $fun1 = sub {
print"$var2";
$var2++;
};
$fun1->();
print "$var2";
}
fun2();
嵌套命名子例程无法访问共享变量的问题已在Perl: "Variable will not stay shared"处链接到。
答案 1 :(得分:4)
您使用的语法从5.18开始有效,但是您需要添加date::zoned_time
来启用它。
use feature qw( lexical_subs );
在5.18之前,您可以使用
use strict;
use warnings;
no warnings qw( experimental::lexical_subs ); # Needed before 5.26. Harmless in 5.26+
use feature qw( lexical_subs say );
sub fun2 {
my $var2 = 10;
my sub fun1 {
say $var2;
++$var2;
}
fun1();
say $var2;
}
fun2();
或
use strict;
use warnings;
use feature qw( say );
sub fun2 {
my $var2 = 10;
my $fun1 = sub {
say $var2;
++$var2;
};
$fun1->();
say $var2;
}
fun2();
答案 2 :(得分:0)
这不是吗?
my $fun1 = sub {
print"$var2";
$var2++;
};