Perl 子例程引用与闭包的深入探究
1. 变量作用域与闭包
在一个裸块(bare block)结束时, $count 变量通常会超出其作用域。但如果它被 $callback 中的子例程引用,它会以匿名标量变量的形式继续存活。当从 find 调用回调时, $count 的值会从 1 递增到 2、3 等等。
闭包声明会增加被引用对象的引用计数,就好像显式地获取了另一个引用一样。在裸块结束时, $count 的引用计数为 2,而在块退出后,其引用计数仍为 1。尽管其他代码可能无法访问 $count ,但只要 $callback 或其他地方存在对子例程的引用,它就会一直保留在内存中。
2. 从子例程返回子例程
虽然裸块可以很好地定义回调,但让一个子例程返回该子例程引用可能更有用。以下是一个示例:
use File::Find;
sub create_find_callback_that_counts {
my $count = 0;
return sub { print ++$count, ": $File::Find::name\n" };
}
my $callback = create_find_callback_that_counts( );
find($callback, '.');
当调用 create_fi
超级会员免费看
订阅专栏 解锁全文
3

被折叠的 条评论
为什么被折叠?



