一.什么是closure
perl 中有一个概念叫“closure”(闭环,来源于数学):
假如有一个subroutine, 它访问了在其外部声明的私有变量,那么这个subroutine就叫做closure.
例如:
{
my $count = 0;
sub callback { print ++$count; };
sub get_count{return $count;};
}
&callback(); //此时, $count = 1
&callback(); //此时, $count = 2
这里,callback和get_count就是一个closure,因为它访问了在其外部声明的私有变量$count.
closure在实际应用中提供了c语言中局部静态变量的功能。
它有以下特性:
1.访问的变量是私有变量,保证只有少数subroutine能访问到该变量,这些具有访问权限的subroutine就构成了一个环,因此也叫闭环;
在上面的例子中,$callback和get_count构成了能访问$count的环;
由于环中的subroutine都可以访问$count(与c语言中的静态变量作用一样),使得每一次访问都可以改变$count的值。
在这个例子中,第一次调用&callback()后, $count的值变为1,第2次调用后,值变为2.
2.该私有变量的生命周期是与环中的生命周期最长的subroutine一样。这是通过perl中的引用计数机制来实现的:
上面的例子中,在括号内的代码部分, $count的引用计数是3,出了括号,$count的引用计数变成了2,
callback生命周期结束的时候,$count的引用计数减去1,此时变为1
get_count生命周期结束的时候,$count的引用计数减去1,此时变为0
当$count的引用计数变为0之后,被perl回收。
</