Chinaunix首页 | 论坛 | 博客
  • 博客访问: 470091
  • 博文数量: 142
  • 博客积分: 4126
  • 博客等级: 上校
  • 技术积分: 1545
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-22 10:03
文章分类

全部博文(142)

文章存档

2011年(8)

2010年(7)

2009年(64)

2008年(63)

我的朋友

分类:

2008-12-22 16:01:51

#!/perl

 ######################################################################例子

 my $name="Tommy"; #词法作用域变量--这个程序文件内有效

 {
   my $name = "Grandfather"; # 词法作用域变量--这个闭合的语句块内有效

   my $age = 86; # 词法作用域变量--这个闭合的语句块内有效

   $ref = sub{ return "$name is $age.\n"; } #定义一个匿名函数的参考,在函数中调用闭合块内的变量

 }
 print "$name is back\n";#这里打印的时候块里的$name已经“过期”了,所以肯定打印的是块外的$name。

 print &{$ref}; # 这里通过参考来调用上面的匿名子函数,此时打印的却是块内的变量的内容。这个子例程就是闭包。

   
 # Output:

 # Tommy is back.

 # Grandfather is 86.

 print "#############################################\n";
 #########################################################################应用1

 sub make_saying {
 my $salute = shift;
 my $newfunc = sub {
 my $target = shift;
 print "$salute, $target!\n";
 };
 return $newfunc; # 返回一个闭合

 }
 $f = make_saying("Howdy"); # 创建一个闭合 -->这里$salute="Howdy"

 $g = make_saying("Greetings"); # 创建另外一个闭合 -->这里$salute="Greetings"

 # 到时...

 $f->("world"); #结果打印 Howdy world

 $g->("earthings"); #结果打印 Greetings earthings

 ##########################################################################应用2

 sub multiply_by {
  my $multiplier = $_[0];
  return sub {
    return $_[0] * $multiplier;
   }
  }

 my $times2 = multiply_by(2);
 my $times10 = multiply_by(10);

 print &$times2(4), "\n";
 print &$times2(6), "\n";
 print &$times10(4) ,"\n";

 # Results:

 # 8

 # 12

 # 40

 ##########################################################################


 #我的理解是:如果一个匿名函数调用词法作用域变量时。

 #它会使变量的参考数增加,从而使其变量的生命可以得以延续,在匿名函数被调用时,就可以访问到这些变量的值。

 #可以理解成夹带这这些变量的子例程。

 #也可以理解成对这些变量的另一种形式的参考。


阅读(500) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~