【问题标题】:How to create sub inside a sub in perl?如何在 perl 中的 sub 内创建 sub?
【发布时间】:2018-10-16 12:42:24
【问题描述】:
sub fun2{
    my $var2 = 10;

    my sub fun1{
        print"$var2";
        $var2++;
    }
   fun1();
   print "$var2";
 }

 fun2();

我想打印 10 和 11,此代码给出错误“在 source_file 中未启用实验性“my”潜艇”,如果我从“my sub fun1”中删除“my”关键字,则会给出错误“变量“$var2”不会在 source_file.pl 行保持共享” 怎么才能让内子修改外子的数据呢?

谢谢

【问题讨论】:

标签: perl


【解决方案1】:

词法命名子例程在 Perl 中仍然(非常)处于试验阶段。简单的方法是改用匿名子例程,这样可以避免丢失共享变量的问题,同时还不是实验性的:

sub fun2{
    my $var2 = 10;

    my $fun1 = sub {
        print"$var2";
        $var2++;
    };
    $fun1->();
    print "$var2";
 }

 fun2();

嵌套命名子例程无法访问共享变量的问题已在Perl: "Variable will not stay shared" 链接到。

【讨论】:

  • 词法命名子例程在 Perl v5.26 中变得稳定。
【解决方案2】:

您使用的语法自 5.18 起有效,但您需要添加 use feature qw( lexical_subs ); 才能启用它。

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();

5.18之前,可以使用

use strict;
use warnings;
use feature qw( say );

sub fun2 {
    my $var2 = 10;

    my $fun1 = sub {
        say $var2;
        ++$var2;
    };

    $fun1->();
    say $var2;
}

fun2();

use strict;
use warnings;
use feature qw( say );

sub fun2 {
    my $var2 = 10;

    local *fun1 = sub {
        say $var2;
        ++$var2;
    };

    fun1();
    say $var2;
}

fun2();

【讨论】:

    【解决方案3】:

    这不应该是:

     my $fun1 = sub {
        print"$var2";
        $var2++;
    };
    

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多