Sorun, Perl'in işlev prototiplerinin insanların yaptıklarını düşündüklerini yapmamasıdır. Amaçları, Perl'in yerleşik işlevleri gibi ayrıştırılacak işlevler yazmanıza izin vermektir.
Her şeyden önce, yöntem çağrıları prototipleri tamamen yok sayar. OO programlama yapıyorsanız, yöntemlerinizin hangi prototipine sahip olduğunun önemi yoktur. (Yani herhangi bir prototipi olmamalıdır.)
İkincisi, prototipler kesinlikle uygulanmaz. İle bir alt rutini çağırırsanız &function(...)
, prototip yok sayılır. Bu yüzden gerçekten herhangi bir güvenlik sağlamazlar.
Üçüncüsü, uzaktaki ürkütücü eylemler. (Özellikle $
ilgili parametrenin varsayılan liste bağlamı yerine skaler bağlamda değerlendirilmesine neden olan prototip.)
Özellikle, dizilerden parametrelerin aktarılmasını zorlaştırırlar. Örneğin:
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]);
baskılar:
a b c
a b
a b c
3
b
a b c
3 uyarı ile birlikte main::foo() called too early to check prototype
(uyarılar etkinleştirilmişse). Sorun, skaler bağlamda değerlendirilen bir dizinin (veya dizi diliminin) dizinin uzunluğunu döndürmesidir.
Yerleşik gibi davranan bir işlev yazmanız gerekiyorsa, bir prototip kullanın. Aksi takdirde, prototip kullanmayın.
Not: Perl 6 tamamen yenilenmiş ve çok kullanışlı prototiplere sahip olacaktır. Bu cevap yalnızca Perl 5 için geçerlidir.