Masalahnya adalah bahwa prototipe fungsi Perl tidak melakukan apa yang orang pikir mereka lakukan. Tujuannya adalah untuk memungkinkan Anda menulis fungsi yang akan diurai seperti fungsi bawaan Perl.
Pertama-tama, panggilan metode mengabaikan prototipe sepenuhnya. Jika Anda melakukan pemrograman OO, tidak masalah prototipe apa yang dimiliki metode Anda. (Jadi mereka seharusnya tidak memiliki prototipe apa pun.)
Kedua, prototipe tidak ditegakkan secara ketat. Jika Anda memanggil subrutin dengan &function(...)
, prototipe akan diabaikan. Jadi mereka tidak benar-benar memberikan keamanan jenis apa pun.
Ketiga, mereka adalah aksi seram dari jarak jauh. (Terutama $
prototipe, yang menyebabkan parameter terkait dievaluasi dalam konteks skalar, bukan konteks daftar default.)
Secara khusus, mereka mempersulit penerusan parameter dari array. Sebagai contoh:
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]);
cetakan:
a b c
a b
a b c
3
b
a b c
bersama dengan 3 peringatan tentang main::foo() called too early to check prototype
(jika peringatan diaktifkan). Masalahnya adalah bahwa sebuah array (atau potongan array) yang dievaluasi dalam konteks skalar mengembalikan panjang dari array tersebut.
Jika Anda perlu menulis fungsi yang berfungsi seperti built-in, gunakan prototipe. Jika tidak, jangan gunakan prototipe.
Catatan: Perl 6 akan memiliki prototipe yang sepenuhnya dirubah dan sangat berguna. Jawaban ini hanya berlaku untuk Perl 5.