2011-12-04 41 views
0

我有以下子程序:Perl中使用CODEREF作爲參數傳遞給子程序

sub my_sub { 
    my $coderef = shift;  
    $coderef->(); 
} 


sub coderef { 
    my $a = shift; 
    my $b = shift; 

    print $a+$b; 
} 

,並要撥打my_sub(\coderef($a,$b))以這種方式,即我想提供與它的代碼裁判的爭論和對my_sub運行功能。是否有可能在Perl中做這樣的事情?

+5

除了作爲非描述性的名稱,'$了'和'$ B'是[專用包變量](http://perldoc.perl.org/perlvar.html#$a)與'sort'一起使用,所以將它們用於其他原因不是一個好主意。 – TLP

回答

8

如果這些潛艇以票面價值進行拍攝,my_sub沒有做任何事情。

有兩件事情會在這裏:

  1. 定義CODEREF

    my $adder = sub { my ($first, $second) = @_; $first + $second }; 
    
    # Adds first two arguments 
    
  2. 必要的參數執行它

    print $adder->(2,3); # '5' 
    

假設my_sub某種傳遞的CODEREF作爲第一個參數函子:

sub functor { 
    my $coderef = shift; # Pull of first argument 
    $coderef->(@_);  # Rest of @_ are coderef arguments 
          # Or simply : sub functor { +shift->(@_) } 
} 

# Usage: 

print functor ($adder, 2, 3); # '5' 
1

這是你想要的嗎?

 
use warnings; 
use strict; 

&my_sub(\&coderef); 

sub my_sub { 
    my $coderef = shift; 
    $coderef->(2, 3); 
} 

sub coderef { 
    my $a= shift; 
    my $b = shift; 

    print $a+$b; 
} 
4

如果我正確理解你的問題,你需要調用換到你的coderef子程序在另一個匿名子,像這樣:

my_sub(sub { coderef(2, 3); }); # replace 2, 3 with whatever arguments 
1

使用匿名子程序。

my $coderef = sub { 
    my ($aa, $bb) = @_; 
    print $aa + $bb; 
}; 

sub my_sub { 
    my ($c_ref, @params) = @_; 
    $c_ref->(@params); 
} 

my_sub($coderef, 2, 3); 
1

另一個想法。也許封閉解決你的問題?如果你寫coderef作爲一個工廠,那麼你可以像這樣的代碼:

use strict; 
use warnings; 

my_sub(coderef(2,3)); 

sub my_sub { 
    my $coderef = shift;  
    $coderef->(); 
} 

sub coderef { 
    my $a = shift; 
    my $b = shift; 

    return sub { print $a + $b }; 
} 

輸出

5 
相關問題