gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:23:39 32 4
gpt4 key购买 nike

我正在尝试调用嵌套递归 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



我还尝试将内部函数声明为本地函数,但收到以下信息:

Global symbol "$innerfunction" requires explicit package name



我对解释型语言没有太多经验,因此任何与内存/堆栈泄漏/损坏或上述伪代码的其他危险相关的附带评论(递归的系统限制除外)也将不胜感激。

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

最佳答案

innerfunction()语法仅适用于已安装到符号表中的子例程(例如 sub NAME {...} 语法)。您需要将内部函数调用为 $innerfunction->()&$innerfunction() ,但是您遇到问题的地方在于 $innerfunction 的范围。词汇。

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

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

weaken 打破循环引用通常的模式是:
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超出范围,子程序将被垃圾收集。

关于perl - 嵌套函数调用范围和语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9624044/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com