perl – 探索匿名subs的用法
发布时间:2020-12-15 22:00:00 所属栏目:大数据 来源:网络整理
导读:我一直对perl中匿名subs的用途和用法感到困惑.我理解这个概念,但是寻找这个实践的价值的例子和解释. 要明确: sub foo { ... } # --- named subsub { ... } # --- anonymous sub 例如: $perl -e 'print sub { 1 }'CODE(0xa4ab6c) 告诉我,sub返回一个标量值.
我一直对perl中匿名subs的用途和用法感到困惑.我理解这个概念,但是寻找这个实践的价值的例子和解释.
要明确: sub foo { ... } # <--- named sub sub { ... } # <--- anonymous sub 例如: $perl -e 'print sub { 1 }' CODE(0xa4ab6c) 告诉我,sub返回一个标量值.所以我可以做: $perl -e '$a = sub { 1 }; print $a' 与上述相同的输出.这当然适用于所有标量值,因此您可以使用匿名subs来加载数组或散列. 问题是,如何使用这些subs?为什么要使用它们? 而对于一个金星,有没有任何问题,只能用匿名子解决? 解决方法
匿名子程序可用于各种事物.
>事件处理系统的回调: my $obj = Some::Obj->new; $obj->on_event(sub {...}); 迭代器 sub stream {my $args = @_; sub {shift @$args}} my $s = stream 1,2,3; say $s->(); # 1 say $s->(); # 2 >高阶功能: sub apply (&@) { my $code = shift; $code->() for my @ret = @_; @ret } my @clean = apply {s/W+/_/g} 'some string','another string.'; say $clean[0]; # 'some_string' >创建别名数组: my $alias = sub {@_}->(my $x,my $y); $alias[0]++; $alias[1] = 5; say "$x $y"; # '1 5'' >使用闭包进行动态编程(例如创建只有少量差异的一组子例程): for my $name (qw(list of names)) { no strict 'refs'; *$name = sub {... something_with($name) ...}; } 没有一个匿名子程序可以做任何命名子程序不能执行的情况.我的$ref = sub {…}构造函数等同于以下内容: sub throw_away_name {...} my $ref = &;throw_away_name; 而不必为每个子项决定唯一的“throw_away_name”. 等价也是相反的,子名称{…}等同于: BEGIN {*name = sub {...}} 所以除了名字之外,由任一方法创建的代码引用是一样的. 要调用子程序引用,可以使用以下任一项: $code->(); # calls with no args $code->(1,3); # calls with args (1,3) &$code(); # calls with no args &$code; # calls with whatever @_ currently is 您甚至可以使用代码引用作为有福或无名标量的方法: my $list = sub {@{ $_[0] }}; say for [1 .. 10]->$list # which prints 1 .. 10 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |