2014-07-02 4 views
6

मैं पर्ल नामित ब्लॉक द्वारा उलझन में हूं (मैंने सोचा कि वे हैं ...)। नीचे एक उदाहरण है:क्या कोई इस तरह के पर्ल कोड ब्लॉक को समझने के बारे में जानता है?

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

4

वे ब्लॉक को एक तर्क के रूप में स्वीकार करते हुए subroutines हैं। देखें: http://perldoc.perl.org/perlsub.html#Prototypes। उनकी परिभाषाओं में (&) का अर्थ है कि उनका पहला तर्क कोड का एक ब्लॉक है।

5

Run, cmd, और 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

संबंधित मुद्दे