11、Perl 子例程引用与闭包的深入探究

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值