perl – 探索匿名subs的用法

前端之家收集整理的这篇文章主要介绍了perl – 探索匿名subs的用法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直对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
原文链接:https://www.f2er.com/Perl/171612.html

猜你在找的Perl相关文章