子程序也有引用,也有匿名子程序。假設你已經具有了數組、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