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

smi*_*ith 0 perl callback perl-data-structures

我有以下子程序:

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


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

    print $a+$b;
}
Run Code Online (Sandbox Code Playgroud)

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

Zai*_*aid 8

如果这些潜艇要按面值采取,my_sub则不做任何事情.

这里有两件事:

  1. 定义coderef

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

    print $adder->(2,3);  # '5'
    
    Run Code Online (Sandbox Code Playgroud)

假设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'
Run Code Online (Sandbox Code Playgroud)