闭包(Closure) 闭包是这样一种子例程,创建时,它将包含其子例程的环境打包(包括所有它需要的和不局部去本身的变量).
子例程的引用:
对有名子例程的引用:
我们前面就已经讲过,要创建对现存变量的引用,只需要它加上反斜杠前缀。对子例程也大致如此,
如&mysub就是对&mysub的引用。
比如:
zjzc01:/root/perl# cat t8.pl
sub greet {
print "Hello
";
};
###没有调用greet函数
$rs=&greet;
print "$rs is $rs
";
##调用函数
&$rs;
#####调用greet函数
$rs=&greet();
zjzc01:/root/perl# perl t8.pl
$rs is CODE(0x219d308)
Hello
Hello
回调函数就是通过引用来使用的普通子例程。
闭包:
不仅可以返回数据,Perl 的子例程还可以返回一个指向子例程的引用。这同其他别的传递子例程引用的方法没有什么不同,
但是有一点是个例外,这是一种设计匿名子历程和词法变量(mysql)的隐含特性,考虑下面的例子:
zjzc01:/root/perl# cat t9.pl
$greeting = "hello world";
$rs = sub{
print $greeting;
};
print "$rs is $rs
";
&$rs;
print "
";
&$rs();
print "
";
zjzc01:/root/perl# perl t9.pl
$rs is CODE(0x1dbf368)
hello world
hello world
zjzc01:/root/perl# cat t10.pl
sub generate_greeting{
my ($greeting) = "hello world";
return sub{print $greeting};
}
$rs = generate_greeting();
&$rs();
zjzc01:/root/perl# perl t10.pl
hello worldzjzc01:/root/perl#
像某个外国移民保留着自己出生地的文化和风俗习惯一样,闭包就是一些保留着在其创建时所在域中需要的变量。
Perl 创建的闭包恰好针对(my)词法变量而不对全局或局部化(使用local)变量