加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 嵌套函数调用范围和语法

发布时间:2020-12-15 23:28:58 所属栏目:大数据 来源:网络整理
导读:我试图调用嵌套的递归perl函数,但我无法解决正确的语法问题. 问题:对嵌套函数执行递归调用的正确语法是什么(如果应该递归调用嵌套函数)? 答:请参阅接受的答案中建议的伪代码. 这是一个伪代码片段: use Scalar::Util;sub outerfunction { my $innerfuncti
我试图调用嵌套的递归perl函数,但我无法解决正确的语法问题.

问题:对嵌套函数执行递归调用的正确语法是什么(如果应该递归调用嵌套函数)?

答:请参阅接受的答案中建议的伪代码.

这是一个伪代码片段:

use Scalar::Util;
sub outerfunction {
  my $innerfunction = sub {
    # Do something
    innerfunction(); 
    # Do other things
  }; 
  Scalar::Util::weaken($innerfunction); 
  &$innerfunction(@_);
};

我试图调用内部函数如下(带有相应的错误消息):

innerfunction

Undefined subroutine &main::innerfunction

&innerfunction

Undefined subroutine &main::innerfunction

&$innerfunction

Global symbol “$innerfunction” requires explicit package name

我也尝试将内部函数声明为local,但收到以下内容:

Global symbol “$innerfunction” requires explicit package name

我对解释语言没有多少经验,因此任何与内存/堆栈泄漏/损坏或上述伪代码的其他危险(除了递归的系统限制之外)相关的附带注释也将非常受欢迎.

谢谢!
在Linux 2.6.34.7-61.fc13.x86_64上运行的perl v5.10.1

解决方法

innerfunction()语法仅适用于已安装到符号表中的子例程(例如子NAME {…}语法确实).你需要将你的内部函数称为$innerfunction->()或& $innerfunction(),但你遇到麻烦的地方是$innerfunction lexical的范围.

当您使用my声明变量时,该变量在该语句结束后在范围内.所以你需要拆分你的声明:

my $innerfunction;
    $innerfunction = sub {
        ...
        $innerfunction->();
        ...
    };

通过弱化通常的模式打破循环引用是:

use Scalar::Util;
sub outer_function {
    my $weak_ref;
    $weak_ref = my $strong_ref = sub {
        # Do something
        $weak_ref->(); 
        # Do other things
    };
    Scalar::Util::weaken($weak_ref); 
    return $strong_ref;
};

所以现在,只要$strong_ref超出范围,子程序就会被垃圾收集.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读