更加常见的使用Closure的方式是从一个子程序中迒回一个子程序.既然是返回值,当然也就可以同时返回多个.- #!perl
-
use File::Find;
-
use strict;
-
use 5.010;
-
sub creat{
-
my $total=0;
-
return(sub{$total+= -s if -f},sub{return $total});
-
}
-
my $subs={};
-
foreach my $dir(qw(vss vim Perl)) {
-
my ($callback,$getter)=creat();
-
$subs->{$dir}{CALLBACK}=$callback;
-
$subs->{$dir}{GETTER}=$getter;
-
}
-
for(keys %$subs){
-
find($subs->{$_}{CALLBACK},$_);
-
}
-
for(sort keys %$subs){
-
my $sum=$subs->{$_}{GETTER}->();
-
print "$_ has $sum bytes\n";
-
}
返个例子中,子程序creat返回了两个匿名子程序,一个用来累加文件大小,一个用来返回文件大小.
之后在一个循环中调用了3次creat,分别用来统计文件夹vss,vim和Perl.
可以看到,由于在哈希subs中使用了不同的文件夹名作为key,而每个key对应的value即是creat的返回值,也就是匿名子程序的引用.由于key值的不同,使得返3组匿名子程序引用成为各不相同的闭包.程序可以得到正确的结果.
阅读(381) | 评论(0) | 转发(0) |