2009-08-05 23 views

उत्तर

37

यहां एक पूर्ण, काम करने वाली स्क्रिप्ट है जो दर्शाती है कि आप क्या पूछ रहे हैं।

sub a { print "Hello World!\n"; } 

sub b { 
    my $func = $_[0]; 
    $func->(); 
} 

b(\&a); 

यहाँ व्याख्या दी गई है: यदि आप \&a कह कर a कार्य करने के लिए एक संदर्भ ले। उस बिंदु पर आपके पास एक फ़ंक्शन संदर्भ है; जबकि सामान्य रूप से एक समारोह func() कह कर कहा जा सकता है कि आप के रूप में अच्छी $func->()

अन्य संदर्भों के साथ -> वाक्य रचना सौदा कह कर एक समारोह संदर्भ कहते हैं। उदाहरण के लिए, यहाँ सरणी और हैश संदर्भ से निपटने का एक उदाहरण है:

sub f { 
    my ($aref, $href) = @_; 
    print "Here's an array reference: $aref->[0]\n"; # prints 5 
    print "Here's a hash ref: $href->{hello}\n";  # prints "world" 
} 

my @a = (5, 6, 7); 
my %h = (hello=>"world", goodbye=>"girl"); 
f(\@a, \%h); 
+1

क्या होगा यदि मैं हैश के हिस्से के रूप में फ़ंक्शन को पास कर रहा था, तो क्या यह ऐसा दिखाई देगा? $ args {function} ->(); – Kys

+0

मैंने सरणी और हैश संदर्भों के लिए उदाहरण जोड़े हैं। च (समारोह => \ &func); तो समारोह, च में, यह इस होगा उप च { $ args {समारोह} ->();} –

+1

लेकिन क्या होगा अगर यह इस था? : हां, '->()' एक कोड संदर्भ को संदर्भित करता है और इसे कॉल करता है। फ़ंक्शन के लिए तर्क माता-पिता के बीच जाते हैं, जैसा कि आप उम्मीद करेंगे। – Kys

4

आप पर्ल में \&my_method के रूप में सबरूटीन्स संदर्भ का उपयोग कर सकते हैं, और $myref->(); साथ उन लोगों के संदर्भ कहते हैं। इसे आज़माएं:

perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);' 

शुभकामनाएँ!

+0

क्या होगा अगर मैं functi गुजर रहा था एक हैश के हिस्से के रूप में, तो यह ऐसा दिखाई देगा? $ Args {समारोह} ->(); – Kys

2

एली Courtwright के उदाहरण के लिए ऊपर के बाद: आप केवल एक बार पहले समारोह का उपयोग करते हैं, तो आप भी एक गुमनाम समारोह के साथ b कह सकते हैं, इस तरह:

b(sub { print "Hello World\n"; }); 
5

आप किसी अन्य कार्य करने के लिए एक समारोह पारित नहीं हो सकता सीधे। इसके बजाय, आप एक समारोह में संदर्भ पास करते हैं। फ़ंक्शन को कॉल करने के लिए आप इसे ->() का उपयोग करके (कोड कोड रेफरी) के रूप में अस्वीकार करते हैं;

sub a { print @_ } 

sub b { 
    my $f = shift; # assuming that $f is a function reference... 
    $f->(@_);  # call it with the remaining arguments 
} 

b(\&a, "hello, world!"); # prints "hello, world!" 

पर्ल पास-दर-नाम अर्थ विज्ञान नहीं है, लेकिन आप एक हैश का उपयोग कर उन्हें अनुकरण कर सकते हैं। फ़ंक्शन को कॉल करने का तरीका वही है। आप इसे अस्वीकार करते हैं।

sub a { print @_ } 

sub b { 
    my %arg = @_; 
    $arg{function}->(@{$arg{arguments}}); 
} 

b(function => \&a, arguments => ["hello, world!"]); 

ObPerl6: पर्ल 6 पास-बाय-नाम अर्थशास्त्र होगा।

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