码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-30 21:26:43      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:数组   介绍   \n   程序   调用   ...   one   llb   没有   

子程序也有引用,也有匿名子程序。假设你已经具备了数组、hash的引用知识,所以这里简单介绍一下。

$ref_sub = \&mysub;      # 子程序引用,&符号必须不能少
&{$ref_sub}(ARGS)        # 解除子程序引用,传递参数ARGS
&$ref_sub(ARGS)          # 解除子程序引用
$ref_sub->(ARGS)         # 解除子程序引用
$ref_sub->()             # 传递空参数

sub {...};               # 定义匿名子程序,sub后面没有名称
$ref_sub = sub {...};    # 匿名子程序的引用

有了子程序引用,就可以按需调用子程序。

例如:

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->();
}

子程序引用、匿名子程序的最大作用可能是用于回调函数(callback)、闭包(closure)。这个话题有点大,见下一篇文章。

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

标签:数组   介绍   \n   程序   调用   ...   one   llb   没有   

原文地址:https://www.cnblogs.com/f-ck-need-u/p/9733283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!