我试图调用嵌套的递归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()语法仅适用于已安装到符号表中的子例程(例如子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超出范围,子程序就会被垃圾收集.