El problema es que los prototipos de función de Perl no hacen lo que las personas piensan que hacen. Su propósito es permitirle escribir funciones que serán analizadas como las funciones integradas de Perl.
En primer lugar, las llamadas a métodos ignoran por completo los prototipos. Si estás haciendo programación OO, no importa qué prototipo tengan tus métodos. (Por lo tanto, no deberían tener ningún prototipo.)
En segundo lugar, los prototipos no se aplican estrictamente. Si llama a una subrutina con &function(...)
, se ignora el prototipo. Entonces, realmente no proporcionan ningún tipo de seguridad.
En tercer lugar, son espeluznantes de acción 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 la transferencia de parámetros desde las 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]);
impresiones:
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 están habilitadas las advertencias). 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 funciona como un built-in, use un prototipo. De lo contrario, no use prototipos.
Nota: Perl 6 tendrá prototipos completamente renovados y muy útiles. Esta respuesta solo se aplica a Perl 5.
Tengo curiosidad también. La única vez que no los uso es cuando estoy llamando con una cantidad variable de argumentos. –
Le recomiendo que lea el artículo, ["Prototipos de Perl considerados dañinos"] (http://www.perlmonks.org/?node_id=861966)? – tchrist