传递一个Function对象并调用它

Kys*_*Kys 29 perl reference

如何在Perl中传递函数,a函数bb调用a

Eli*_*ght 44

这是一个完整的,有效的脚本,可以演示您的要求.

sub a { print "Hello World!\n"; }

sub b {
    my $func = $_[0];
    $func->();
}

b(\&a);
Run Code Online (Sandbox Code Playgroud)

这是一个解释:你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);
Run Code Online (Sandbox Code Playgroud)


Mic*_*man 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!"
Run Code Online (Sandbox Code Playgroud)

Perl没有按名称传递语义,但您可以使用哈希模拟它们.调用该函数的方法是相同的.你取消引用它.

sub a { print @_ }

sub b {
    my %arg = @_;
    $arg{function}->(@{$arg{arguments}});
}

b(function => \&a, arguments => ["hello, world!"]);
Run Code Online (Sandbox Code Playgroud)

ObPerl6:Perl 6将具有按名称传递的语义.