我有以下子程序:
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 中做这样的事情?
我有以下子程序:
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 中做这样的事情?
如果这些潜艇要按面值来衡量,那就my_sub
什么都做不了。
这里有两件事:
定义代码参考
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
子程序的调用包装在另一个匿名子程序中,如下所示:
my_sub(sub { coderef(2, 3); }); # replace 2, 3 with whatever arguments
这是你想要的吗?
使用警告; 使用严格; &my_sub(\&coderef); 子我的子{ 我的 $coderef = 班次; $coderef->(2, 3); } 子代码参考{ 我的 $a= 班次; 我的 $b = 班次; 打印 $a+$b; }
使用匿名子例程。
my $coderef = sub {
my ($aa, $bb) = @_;
print $aa + $bb;
};
sub my_sub {
my ($c_ref, @params) = @_;
$c_ref->(@params);
}
my_sub($coderef, 2, 3);
另一个想法。也许闭包可以解决您的问题?如果你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