WMX*_*WMX 4 syntax recursion perl scope
我试图调用嵌套的递归perl函数,但我无法解决正确的语法问题.
问题:对嵌套函数执行递归调用的正确语法是什么(如果应该递归调用嵌套函数)?
答:请参阅接受的答案中建议的伪代码.
这是一个伪代码片段:
use Scalar::Util;
sub outerfunction {
my $innerfunction = sub {
# Do something
innerfunction();
# Do other things
};
Scalar::Util::weaken($innerfunction);
&$innerfunction(@_);
};
Run Code Online (Sandbox Code Playgroud)
我试图调用内部函数如下(带有相应的错误消息):
innerfunction
Run Code Online (Sandbox Code Playgroud)
未定义的子程序&main :: innerfunction
&innerfunction
Run Code Online (Sandbox Code Playgroud)
未定义的子程序&main :: innerfunction
&$innerfunction
Run Code Online (Sandbox Code Playgroud)
全局符号"$ innerfunction"需要显式包名
我也尝试将内部函数声明为local,但收到以下内容:
全局符号"$ innerfunction"需要显式包名
我对解释语言没有多少经验,因此任何与内存/堆栈泄漏/损坏或上述伪代码的其他危险(除了递归的系统限制之外)相关的附带注释也将非常受欢迎.
谢谢!在Linux 2.6.34.7-61.fc13.x86_64上运行的perl v5.10.1
Eri*_*rom 14
该innerfunction()
语法仅适用于已安装到符号表中的子例程(例如sub NAME {...}
语法).你需要将你的内在函数称为$innerfunction->()
或&$innerfunction()
,但是你遇到麻烦的地方是$innerfunction
词汇的范围.
使用声明变量时my
,变量在该语句结束后的范围内.所以你需要拆分你的声明:
my $innerfunction;
$innerfunction = sub {
...
$innerfunction->();
...
};
Run Code Online (Sandbox Code Playgroud)
用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;
};
Run Code Online (Sandbox Code Playgroud)
所以现在,一旦$strong_ref
超出范围,子程序将被垃圾收集.