perl使用coderef作为子例程的参数

时间:2011-12-04 12:56:34

标签: perl callback perl-data-structures

我有以下子程序:

sub my_sub {
    my $coderef = shift;    
    $coderef->();
}


sub coderef {
    my $a = shift;
    my $b = shift;

    print $a+$b;
}

并希望以这种方式调用my_sub(\coderef($a,$b)),即我想用它提供代码ref的参数并在my_sub函数上运行它。在perl中可以做这样的事情吗?

5 个答案:

答案 0 :(得分:8)

如果要按面值采用这些潜艇,my_sub没有做任何事情。

这里有两件事:

  1. 定义coderef

    my $adder = sub { my ( $first, $second ) = @_; $first + $second };
    
    # Adds first two arguments
    
  2. 使用必要参数执行

    print $adder->(2,3);  # '5'
    

  3. 假设my_sub是某种类型的仿函数,它将coderef作为第一个参数传递:

    sub functor {
        my $coderef = shift;  # Pull of first argument
        $coderef->( @_ );     # Rest of @_ are coderef arguments
                              # Or simply : sub functor { +shift->( @_ ) }
    }
    
    # Usage:
    
    print functor ( $adder, 2, 3 );  # '5'
    

答案 1 :(得分:4)

如果我理解你的问题,你需要在另一个匿名子程序中包含对coderef子程序的调用,如下所示:

my_sub(sub { coderef(2, 3); }); # replace 2, 3 with whatever arguments 

答案 2 :(得分:2)

这是你想要的吗?

use warnings;
use strict;

&my_sub( \&coderef );

sub my_sub {
    my $coderef = shift;
    $coderef->(2, 3);
}

sub coderef {
    my $a= shift;
    my $b = shift;

    print $a+$b;
}

答案 3 :(得分:1)

使用匿名子程序。

my $coderef = sub {
    my ($aa, $bb) = @_;
    print $aa + $bb;
};

sub my_sub {
    my ($c_ref, @params) = @_;
    $c_ref->(@params);
}

my_sub($coderef, 2, 3);

答案 4 :(得分:1)

另一个想法。也许封闭解决了你的问题?如果您将coderef作为工厂编写,那么您可以这样编码:

use strict;
use warnings;

my_sub(coderef(2,3));

sub my_sub {
  my $coderef = shift;    
  $coderef->();
}

sub coderef {
    my $a = shift;
    my $b = shift;

    return sub { print $a + $b };
}

<强>输出

5