Perl子程序引用和匿名子程序

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

相關文章
相關標籤/搜索