第四章 闭包

闭包(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)变量








原文地址:https://www.cnblogs.com/hzcya1995/p/13351130.html