ปัญหาคือต้นแบบฟังก์ชันของ Perl ไม่ได้ทำในสิ่งที่คนทั่วไปคิด วัตถุประสงค์ของพวกเขาคือเพื่อให้คุณสามารถเขียนฟังก์ชันที่จะแยกวิเคราะห์เช่นฟังก์ชันในตัวของ Perl
ประการแรกการเรียกเมธอดละเว้นต้นแบบโดยสิ้นเชิง หากคุณกำลังเขียนโปรแกรม 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
(หากเปิดใช้งานคำเตือน) ปัญหาคืออาร์เรย์ (หรือส่วนอาร์เรย์) ที่ประเมินในบริบทสเกลาร์จะส่งกลับความยาวของอาร์เรย์
หากคุณต้องการเขียนฟังก์ชันที่ทำหน้าที่เหมือนในตัวให้ใช้ต้นแบบ มิฉะนั้นอย่าใช้ต้นแบบ
หมายเหตุ: Perl 6 จะได้รับการปรับปรุงใหม่ทั้งหมดและต้นแบบที่มีประโยชน์มาก คำตอบนี้ใช้ได้กับ Perl 5 เท่านั้น