समस्या यह है कि पर्ल के फंक्शन प्रोटोटाइप वे नहीं करते जो लोग सोचते हैं कि वे करते हैं। उनका उद्देश्य आपको उन कार्यों को लिखने की अनुमति देता है जिन्हें पर्ल के अंतर्निहित कार्यों की तरह पार्स किया जाएगा।
सबसे पहले, विधि कॉल पूरी तरह से प्रोटोटाइप को अनदेखा करती है। यदि आप OO प्रोग्रामिंग कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि आपके तरीकों में क्या प्रोटोटाइप है। (इसलिए उनके पास कोई प्रोटोटाइप नहीं होना चाहिए।)
दूसरा, प्रोटोटाइप सख्ती से लागू नहीं किए गए हैं। यदि आप एक सबरूटीन कहते हैं &function(...)
, तो प्रोटोटाइप को अनदेखा कर दिया जाता है। इसलिए वे वास्तव में किसी भी प्रकार की सुरक्षा प्रदान नहीं करते हैं।
तीसरा, वे डरावना एक्शन-ऑन-ए-डिस्टेंस हैं। (विशेष रूप से$
प्रोटोटाइप, जिसके कारण डिफ़ॉल्ट पैरामीटर संदर्भ के बजाय स्केलर संदर्भ में संबंधित पैरामीटर का मूल्यांकन किया जाता है।)
विशेष रूप से, वे सरणियों से पैरामीटर पास करना कठिन बनाते हैं। उदाहरण के लिए:
my @array = qw(a b c);
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
sub foo ($;$$) { print "@_\n" }
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
प्रिंट:
a b c
a b
a b c
3
b
a b c
3 चेतावनियों के साथ main::foo() called too early to check prototype
(यदि चेतावनियाँ सक्षम हैं)। समस्या यह है कि स्केलर संदर्भ में मूल्यांकन किए गए एक सरणी (या सरणी स्लाइस) सरणी की लंबाई लौटाती है।
यदि आपको एक फ़ंक्शन लिखने की आवश्यकता है जो बिल्ट-इन की तरह काम करता है, तो एक प्रोटोटाइप का उपयोग करें। अन्यथा, प्रोटोटाइप का उपयोग न करें।
नोट: पर्ल 6 पूरी तरह से नया और बहुत उपयोगी प्रोटोटाइप होगा। यह उत्तर केवल पर्ल 5 पर लागू होता है।