2010-01-18 7 views
6

मेरे पास एक ऐसी सूची है जिसमें तर्क शामिल हैं जो मैं किसी फ़ंक्शन को पास करना चाहता हूं। मैं उस समारोह को कैसे कॉल करूं?मैं एक पर्ल सरणी संदर्भ में तत्वों को एक subroutine के लिए अलग तर्क के रूप में कैसे पारित कर सकता हूं?

उदाहरण के लिए, कल्पना मैं इस समारोह था:

sub foo { 
    my ($arg0, $arg1, $arg2) = @_; 
    print "$arg0 $arg1 $arg2\n"; 
} 

और मान लें कि मेरे पास करते हैं:

my $args = [ "la", "di", "da" ]; 

मैं कैसे foo कहते हैं foo($$args[0], $$args[1], $$args[2]) लेखन के बिना?

+2

'लागू' कहां से आता है? क्या यह एक और भाषा में एक निर्माण है? – daotoad

+3

आवेदन LISP से आता है http://nostoc.stanford.edu/jeff/llisp/21.html –

+1

@daotoad लिस्प से आता है लेकिन अधिकांश भाषाओं में इसका समकक्ष रूप होता है। यह उन चीजों में से एक है जो Google के लिए वास्तव में कठिन है क्योंकि विभिन्न भाषाओं में एक ही चीज़ के लिए अलग-अलग शब्दावली होती है। –

उत्तर

9

यह करना चाहिए:

foo(@$args) 

वास्तव में एक apply कार्य नहीं है यही कारण है कि। वह वाक्यविन्यास सिर्फ सरणी सरणी पर एक सरणी संदर्भ को संदर्भित करता है। man perlref आपको जनमत के बारे में और बताता है।

+0

आप शुरू करने के संदर्भ को भी संदर्भित नहीं कर सकते हैं, यानी '@args = (" la "," de "," dah ")' या यहां तक ​​कि '@args = qw (la de dah);' और फिर इसे पास करना 'foo (@args)' के साथ। संदर्भ संदर्भ करने से यह क्लीनर और अधिक सरल है, हालांकि यदि आपके पास अन्य बाधाएं हैं (उदाहरण के लिए सरणी डेटा संरचना का हिस्सा है, तो यह एक बड़ा सौदा नहीं है। – fennec

6

इस प्रयास करें:

foo(@$args); 
10

आप इसके सामने @ चिपके हुए एक सरणी संदर्भ को अस्वीकार करते हैं।

foo(@$args); 

या यदि आप अधिक स्पष्ट होना चाहता हूँ:

foo(@{ $args }); 
4
foo(@$args); 

या, यदि आप foo के लिए एक संदर्भ है:

my $func = \&foo; 
... 
$func->(@$args); 
संबंधित मुद्दे

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