我有以下子程序:
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中可以做这样的事情吗?
答案 0 :(得分:8)
如果要按面值采用这些潜艇,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'
答案 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