1 sub outer_func {
2 my $name = "Perl-ista";
3 my $inner_func = sub {
4 print "Hello, $name!\n";
5 };
6 $inner_func->();
7 }
8 outer_func();
8 → 1(进入 outer_func) → 2 → 5(把匿名子例程的引用赋给局部变量 $inner_func) → 6 → 3(进入匿名子例程) → 4 → 4 返回 → 6 返回 → 8 结束。
函数绑定(创建 CODE 引用并与变量关联)的时间
• outer_func:在 编译阶段 就被解析并绑定到包符号表,代码尚未运行即已存在。
• $inner_func:在 运行时 每次执行到第 5 行时才把匿名子例程的 CODE 引用赋给局部变量 $inner_func;每次调用 outer_func 都会重新创建并绑定一次。
匿名函数(anonymous sub / 闭包)没有名字,因此编译器无法在编译期就把它塞进包符号表;只有到运行期 真正执行到创建它的那条语句 时,Perl 才现场生成新的 CV 对象并返回引用。于是它只能“在运行时”。