2014-07-02 3 views
6

Ich bin verwirrt von Perl Named Blocks (ich dachte, sie sind ...). Unten ist ein Beispiel:Kann jemand solche Art von Perl Code Blocks verstehen?

#!/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}; 
}; 

Beachten Sie die letzten Zeilen. Es sieht aus wie "Run", "cmd", "expect" sind benannte Blöcke, aber keine Funktionen. Weiß jemand was sie sind? Jeder verfügbare Link führt sie ein? Ich kann keine Referenz für eine solche Grammatik finden.

Antwort

9

Lassen Sie uns diese Definition entschlüsseln für Run:

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

Es bedeutet Unterroutine Run genannt, die CODE Parameter des Typs akzeptiert (das ist, warum es (&) verwendet). Darin wird $decl diesem übergebenen Code zugewiesen, und dieser Code wird von $decl->(); aufgerufen.

Nun letzte Zeilen in Ihrem Beispiel:

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

gleichwertig sind:

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

Mit anderen Worten, es nennt Run mit anonymer Prozedur Code, der in Klammer ist.

+0

Vielen Dank für Ihre Antwort. Das wollte ich. – Hao

5

Run, cmd und expect sind prototype definierten Funktionen, und sie arbeiten wie integrierte Funktionen (keine Notwendigkeit sub{..} zu schreiben, da dies für diese Funktionen implizit durch (&) Signatur).

Wenn diese Funktionen ohne Prototypen definiert wurden,

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

dann explizite sub{} Argumente nicht optional sein, aber erforderlich,

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

Verstanden, danke. – Hao

Verwandte Themen