1

我有以下子程序:

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 中做这样的事情?

4

5 回答 5

9

如果这些潜艇要按面值来衡量,那就my_sub什么都做不了。

这里有两件事:

  1. 定义代码参考

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

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

假设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'
于 2011-12-04T14:41:59.227 回答
4

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

my_sub(sub { coderef(2, 3); }); # replace 2, 3 with whatever arguments 
于 2011-12-04T13:05:57.850 回答
2

这是你想要的吗?

使用警告;
使用严格;

&my_sub(\&coderef);

子我的子{
    我的 $coderef = 班次;
    $coderef->(2, 3);
}

子代码参考{
    我的 $a= 班次;
    我的 $b = 班次;

    打印 $a+$b;
}
于 2011-12-04T13:03:19.593 回答
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);
于 2011-12-04T13:54:09.390 回答
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
于 2011-12-09T01:36:44.087 回答