如何在Perl的Sub中创建Sub?

时间:2018-10-16 12:42:25

标签: perl

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行保持共享状态” 我们如何允许内部子对象修改外部子对象的数据?

谢谢

3 个答案:

答案 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++;
};