El problema es que los prototipos de funciones de Perl no hacen lo que la gente cree que hacen. Su propósito es permitirle escribir funciones que se analizarán como las funciones integradas de Perl.
En primer lugar, las llamadas a métodos ignoran por completo los prototipos. Si está haciendo programación OO, no importa qué prototipo tengan sus métodos. (Por lo que no deberían tener ningún prototipo).
En segundo lugar, los prototipos no se aplican estrictamente. Si llama a una subrutina con &function(...)
, el prototipo se ignora. Por lo que realmente no brindan ningún tipo de seguridad.
En tercer lugar, son acciones espeluznantes a distancia. (Especialmente el $
prototipo, que hace que el parámetro correspondiente se evalúe en contexto escalar, en lugar del contexto de lista predeterminado).
En particular, dificultan el paso de parámetros desde matrices. Por ejemplo:
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]);
huellas dactilares:
a b c
a b
a b c
3
b
a b c
junto con 3 advertencias sobre main::foo() called too early to check prototype
(si las advertencias están habilitadas). El problema es que una matriz (o porción de matriz) evaluada en contexto escalar devuelve la longitud de la matriz.
Si necesita escribir una función que actúe como una incorporada, use un prototipo. De lo contrario, no utilice prototipos.
Nota: Perl 6 tendrá prototipos completamente renovados y muy útiles. Esta respuesta se aplica solo a Perl 5.