2017-01-16 69 views
0

要寫封在Perl中我們需要寫Perl和閉包。是否有可能?

sub test { 
    my($x, $y, $z) = @_; 

    my $closure = sub{ $x + $y + $z }; 
} 

但有時,如果不是一如既往的子程序可能有很多行,我想外面拿子程序的定義和使用這樣的

my $z; 

sub test { 
    my($x, $y) = @_; 

    my $closure = closure('subname', $x, $y, $z); 
} 

sub subname : closure ($var1, $var2, $var3) { 
    $var1 + $var2 + $var3 
} 

所以我可以重複使用從其他地方

my $on2; 

sub test_xxx { 
    my($other_name1, $on3) = @_; 

    my $closure = closure('subname', $on3, $other_name1, $on2); 
} 

這個封閉這是可能在Perl?

+1

這種事情通常被稱爲「工廠」,它的東西我寫的[Intemediate的Perl]相當多的(HTTPS:/ /www.intermediateperl.com)和[掌握Perl](https://www.masteringperl.org)。 –

回答

3

嘗試這樣:

use 5.012; 
use warnings; 

my $z; 
sub test 
{ 
    my ($x, $y) = @_; 

    return sub { complicated_code($x, $y, $z) }; 
} 

my $on2; 
sub test_xxx 
{ 
    my ($other_name1, $on3) = @_; 

    return sub { complicated_code($on3, $other_name1, $on2) }; 
} 

sub complicated_code 
{ 
    my ($a, $b, $c) = @_; 

    return $a + $b + $c; 
} 

$z = 42; 
my $closure = test(2,3); 
say $closure->();  # 47 
$z = 1; 
say $closure->();  # 6 

my $closure_xxx = test_xxx(4,5); 
$on2 = 23; 
say $closure_xxx->(); # 32 

換句話說,把你的許多行復雜的代碼在常規sub,並簡單地稱之爲sub在你關閉。

+1

你能解釋一下你的代碼在做什麼以及爲什麼它不同於那些可能不瞭解你發佈的內容的OP問題? – stevieb

+1

@stevieb,OP使用僞代碼; mscha提供了一個實現。但他們也改變了所有的名字,很難看到平行線。這就是爲什麼我張貼我的答案,這實際上只是mscha的重新措詞。 – ikegami

4

closure將被定義如下:

sub closure { 
    my ($sub_name, @args) = @_; 
    my $sub = \&$subname; 
    return sub { $sub->(@args) }; 
} 

但這種間接是無益的。取而代之的是,只需更換

my $closure = closure('subname', $x, $y, $z); 

my $closure = closure('subname', $on3, $other_name1, $on2); 

my $closure = sub { subname($x, $y, $z) }; 

my $closure = sub { subname($on3, $other_name1, $on2) }; 

如果你確實需要一個幫手,它不會是很通用。它通常會有一些特定的任務,準備代碼後面加return sub { };

sub make_foo_iter { 
    my @args = @_; 
    # ... 
    return sub { 
     # ... 
    }; 
} 

my $iter = make_foo_iter(...); 
相關問題