1 sub outer_func {
2 my $name = "Perl-ista";
3 sub inner_func { # 注意:Perl 里 sub 后的名字必须是裸字,不能带 $
4 print "Hello, $name!\n";
5 }
6 inner_func(); # 裸字调用
7 }
8 outer_func();
一、执行顺序
8 → 1(进入 outer_func) → 2 → 5(编译阶段早已完成,这里什么都不做) → 6 → 4 → 4 返回 → 6 返回 → 7 返回 → 8 结束。
二、函数绑定的时间
• outer_func:在 编译阶段 就被解析并绑定到当前包的符号表(main::outer_func),代码尚未运行即已存在。
• inner_func:同样在 编译阶段 被解析并绑定到当前包的符号表(main::inner_func)。
因此无论 outer_func 被调用多少次,inner_func 始终只有一份,不会像 Python 那样每次调用都重新创建一个新的闭包。变量 $name 在 inner_func 中按正常词法作用域规则可见(Perl 的 “static binding”)。
perl是:•
inner_func:同样在 编译阶段 被解析并绑定到当前包的符号表(main::inner_func)。
可能有的文章说是运行时绑定其实都无所谓,因为它是闭包是根据槽号来的,运行时绑定和编译时板顶到全局符号表(包符号表),不会改变的,因为字节码一样,一次运行,inner_func函数对象就确定了,不会再创建了;
而python的inner_func是根据变量来的,字节码不固定,函数对象运行时确定