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
没有任何作用
这里有两件事:
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
没有任何作用
这里有两件事:
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
与排序
一起使用,因此出于其他原因使用它们不是一个好主意。