2010-03-04 19 views
7

यह कोड है:जब मैं इस प्रोटोटाइप पर्ल सबराउटिन में कोडेफ पास करता हूं तो मुझे सिंटैक्स त्रुटि क्यों मिल रही है?

sub function($&) { 
    my $param1 = shift; 
    my $code = shift; 
    # do something with $param1 and $code 
} 

अगर मैं इसे इस तरह से कॉल करने का प्रयास करता हूं:

function("whatever") { 
    print "i'm inside the coderef\n"; 
} 

मुझे Not enough arguments for MyPackage::function at x.pl line 5, near ""whatever" { " मिलता है। मैं कोड ब्लॉक के सामने sub जोड़ने के बिना इसे कैसे कॉल कर सकता हूं?

उत्तर

18

रखो coderef तर्क पहले:

sub function (&$) { 
    my $code = shift; 
    my $param1 = shift; 
    # do something with $param1 and $code 
} 

function { print "i'm inside the coderef\n" } "whatever"; 

perlsub आदमी पेज, जो भाग में पढ़ता देखें:

एक "और" एक गुमनाम सबरूटीन, की आवश्यकता है जो, अगर पहले तर्क के रूप में पारित , को "उप" कीवर्ड या बाद के अल्पविराम की आवश्यकता नहीं है।
+0

यह पहली तर्क होने पर क्यों काम नहीं करता है? – Geo

+5

@ जीओ, यह काम कर सकता है, लेकिन आपको और अधिक स्पष्ट होने की आवश्यकता है: 'फ़ंक्शन ("जो कुछ भी", सब {प्रिंट "मैं coderef \ n"} के अंदर हूं); 'नाम' ब्लॉक एक्सपीआर 'वाक्यविन्यास केवल तभी काम करता है अगर कोडेफ पहले आता है। – friedo

+4

केवल इसलिए कि इसे इस तरह से डिजाइन किया गया था। मुझे संदेह है कि इसे पहली जगह में अनुमति देने का मुख्य कारण उपयोगकर्ताओं को सबराउटिन लिखने देना था जिसे अंतर्निहित फ़ंक्शंस कहा जा सकता है जो मानचित्र और grep जैसे कोड का एक छोटा सा स्निपेट लेते हैं, लेकिन कुछ भी लचीला शायद भ्रमित हो सकता है। – Sean

-3

यहां, $ & एक पर्ल का विशेष चर है जिसका उपयोग सटीक पैटर्न से मेल खाने के लिए किया जाता है। (आपने इसे अपने संदर्भ में गलत तरीके से उपयोग किया है) $ `दिए गए पैटर्न से पहले स्ट्रिंग से मेल खाने के लिए उपयोग किया जाता है। दिए गए पैटर्न के बाद स्ट्रिंग से मेल खाने के लिए $ 'का उपयोग किया जाता है।

+1

जिस संदर्भ में ओपी इसका उपयोग करता है, यह एक फ़ंक्शन प्रोटोटाइप है। Http://perldoc.perl.org/perlsub.html#Prototypes देखें – friedo

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