如何在Perl中将函数a
传递给函数b
,并b
调用a
?
答案 0 :(得分:43)
这是一个完整的,有效的脚本,可以演示您的要求。
sub a { print "Hello World!\n"; }
sub b {
my $func = $_[0];
$func->();
}
b(\&a);
以下是一个解释:您通过说a
来引用函数\&a
。那时你有一个功能参考;虽然通常会通过说func()
调用函数引用来调用函数$func->()
->
语法也处理其他引用。例如,这是处理数组和哈希引用的示例:
sub f {
my ($aref, $href) = @_;
print "Here's an array reference: $aref->[0]\n"; # prints 5
print "Here's a hash ref: $href->{hello}\n"; # prints "world"
}
my @a = (5, 6, 7);
my %h = (hello=>"world", goodbye=>"girl");
f(\@a, \%h);
答案 1 :(得分:9)
您无法直接将功能传递给其他功能。而是将引用传递给函数。要调用该函数,请使用->()
;
sub a { print @_ }
sub b {
my $f = shift; # assuming that $f is a function reference...
$f->(@_); # call it with the remaining arguments
}
b(\&a, "hello, world!"); # prints "hello, world!"
Perl没有按名称传递语义,但您可以使用哈希模拟它们。调用该函数的方法是相同的。你取消引用它。
sub a { print @_ }
sub b {
my %arg = @_;
$arg{function}->(@{$arg{arguments}});
}
b(function => \&a, arguments => ["hello, world!"]);
ObPerl6:Perl 6将具有按名称传递的语义。
答案 2 :(得分:4)
您可以在Perl中以\&my_method
的形式访问子例程引用,并使用$myref->();
调用这些引用。试试这个:
perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);'
祝你好运!
答案 3 :(得分:3)
跟随Eli Courtwright的例子:如果你只使用第一个函数一次,你也可以使用匿名函数调用b
,如下所示:
b( sub { print "Hello World\n"; } );