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

perl使用coderef作为子例程的参数,perl,callback,perl-data-structures,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)),也就是说,我希望提供code ref的参数,并在my_sub函数上运行它。可以在perl中执行类似的操作吗?这就是您想要的吗 use

我有以下子程序:

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


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

    print $a+$b;
}
并希望以这种方式调用
my_sub(\coderef($a,$b))
,也就是说,我希望提供code ref的参数,并在my_sub函数上运行它。可以在perl中执行类似的操作吗?

这就是您想要的吗

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; } 使用警告; 严格使用; &我的sub(\&coderef); sub my_sub{ my$coderef=shift; $coderef->(2,3); } 子代码参考{ 我的$a=班次; 我的$b=班次; 打印$a+b; } 这是你想要的吗

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; } 使用警告; 严格使用; &我的sub(\&coderef); sub my_sub{ my$coderef=shift; $coderef->(2,3); } 子代码参考{ 我的$a=班次; 我的$b=班次; 打印$a+b; }
如果我正确理解了您的问题,您需要将对
coderef
子例程的调用封装在另一个匿名子例程中,如下所示:

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

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

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

使用匿名子例程

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

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

my_sub($coderef, 2, 3);

使用匿名子例程

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

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

my_sub($coderef, 2, 3);

如果这些潜艇是按面值计算的,
my_sub
没有任何作用

这里有两件事:

  • 定义coderef

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

    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'
    

    如果这些潜艇是按面值计算的,
    my_sub
    没有任何作用

    这里有两件事:

  • 定义coderef

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

    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'
    

    另一个想法。也许结案能解决你的问题?如果您以工厂身份编写
    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
    

    另一个想法。也许结案能解决你的问题?如果您以工厂身份编写
    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
    

    除了作为非描述性名称,
    $a
    $b
    排序
    一起使用,因此出于其他原因使用它们不是一个好主意。除了作为非描述性名称,
    $a
    $b
    排序
    一起使用,因此出于其他原因使用它们不是一个好主意。