2014-07-02 69 views
6

我很困惑Perl命名塊(我認爲他們是...)。下面是一個例子:有沒有人知道如何理解這種Perl代碼塊?

#!/usr/bin/perl 

sub Run(&){ 
    my ($decl) = @_; 
    $decl->(); 
} 

sub cmd(&){ 
    my($decl) = @_; 
    my(@params) = $decl->(); 
    print "@params\n"; 
} 
sub expect(&){ 
    my ($decl) = @_; 
    my(@params) = $decl->(); 
    print "@params\n"; 
} 

Run { 
    cmd { "echo hello world " }; 
    expect { exit_code => 0, capture => 2}; 
}; 

請注意最後一行。它看起來像「運行」,「cmd」,「期望」被命名爲塊,但不是函數。有誰知道他們是什麼?任何可用的鏈接介紹他們? 我找不到這樣的語法的任何參考。

回答

9

讓我們來解讀這個定義爲Run

sub Run(&){ 
    my ($decl) = @_; 
    $decl->(); 
} 

這意味着子程序稱爲Run,它接受CODE類型的參數(這就是爲什麼它使用(&))。在它內部,$decl被賦值爲通過的代碼,並且該代碼被$decl->();調用。

現在,最後一行在你的榜樣:

Run { 
    cmd { "echo hello world " }; 
    expect { exit_code => 0, capture => 2}; 
}; 

等同於:

Run(sub { 
    cmd { "echo hello world " }; 
    expect { exit_code => 0, capture => 2}; 
}); 

換句話說,它具有匿名程序代碼是在括號調用Run

+0

謝謝您的回答。這就是我想要的。 – Hao

5

Runcmd,並expectprototype定義的功能,他們的工作就像內置功能(無需編寫sub{..},因爲這是隱含由於(&)簽名爲這些功能)。

如果這些函數原型沒有定義,

sub Run { .. } 
sub cmd { .. } 
sub expect { .. } 

則明確sub{}論點是不可選的,但需要,

Run(sub{ 
    cmd(sub{ "echo hello world " }); 
    expect(sub{ exit_code => 0, capture => 2}); 
}); 
+0

明白了,謝謝。 – Hao

相關問題