2009-08-05 109 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將具有通過名稱的語義。

相關問題