子程序也有引用,也有匿名子程序。假设你已经具有了数组、hash的引用知识,因此这里简单介绍一下。java
$ref_sub = \&mysub; # 子程序引用,&符号必须不能少 &{$ref_sub}(ARGS) # 解除子程序引用,传递参数ARGS &$ref_sub(ARGS) # 解除子程序引用 $ref_sub->(ARGS) # 解除子程序引用 $ref_sub->() # 传递空参数 sub {...}; # 定义匿名子程序,sub后面没有名称 $ref_sub = sub {...}; # 匿名子程序的引用
有了子程序引用,就能够按需调用子程序。python
例如:数组
sub java_learn { print "Learning Java now\n"; } sub perl_learn { print "Learning Perl now\n"; } sub python_learn { print "Learing Python now\n"; } %sub_hash=( "javaer" => \&java_learn, "perler" => \&perl_learn, "pythoner" => \&python_learn, ); while(my ($who,$sub)=each %sub_hash){ print "$who is learning\n"; $sub->(); }
改为匿名子程序:数据结构
$javaer = sub { print "Learning Java now\n"; }; $perler = sub { print "Learning Perl now\n"; }; $pythoner = sub { print "Learing Python now\n"; }; foreach (qw(javaer perler pythoner)){ print "$_ is learning\n"; $$_->(); }
甚至,将匿名子程序做为数据结构的一部分:闭包
%sub_hash = ( "javaer" => sub { print "Learning Java now\n"; }, "perler" => sub { print "Learning Perl now\n"; }, "pythoner" => sub { print "Learning Python now\n"; }, ); while( my($who,$sub)=each %sub_hash ){ print "$who is learning\n"; $sub->(); }
不少时候可能但愿子程序的执行结果内插到双引号中,这时能够采用技巧"some string @{ [ mysub(arg1,arg2) ] } some string"
的方式,将mysub的执行结果放进两端"some string"的中间。这是经过构建匿名列表,而后解除匿名数组实现的,由于数组是能够内插在双引号中的。函数
子程序引用、匿名子程序的最大做用多是用于回调函数(callback)、闭包(closure)。这个话题有点大,见下一篇文章。code