传递一个Function对象并调用它

时间:2009-08-05 17:29:20

标签: perl reference

如何在Perl中将函数a传递给函数b,并b调用a

4 个答案:

答案 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)

您无法直接将功能传递给其他功能。而是将引用传递给函数。要调用该函数,请使用->();

取消引用它(作为CODE引用)
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"; } );