2009-08-05 70 views

回答

37

下面是一个完整的工作脚本,演示您所要求的内容。

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

如果我将该函数作为散列的一部分传递,那么它会是这样吗? $ args {function} - >(); – Kys 2009-08-05 18:15:13

+0

我已经添加了数组和散列引用的示例。但是,如果 – 2009-08-05 18:26:55

+1

它是这样的: F(功能=> \ &func); 然后在函数f,那会是这个 副反馈{ 的$ args {功能} - >(); } – Kys 2009-08-05 18:44:12

4

您可以访问子程序引用和Perl一样\&my_method,并呼吁与$myref->();这些引用。试试这个:

perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);' 

祝你好运!

+0

如果我通过函数作为哈希的一部分,那么它会是这样吗?的$ args {函数} - >(); – Kys 2009-08-05 18:23:59

2

继达礼Courtwright的例子:如果你只使用第一个函数一次,你也可以打电话b与匿名函数,像这样:

b(sub { print "Hello World\n"; }); 
5

你不能传递一个函数到另一个函数直。相反,您将一个参考传递给一个函数。要调用该函数,请使用->()对其进行解引用(作为CODE ref);

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将具有通过名称的语义。

相关问题