Il problema è che i prototipi di funzione di Perl non fanno ciò che le persone pensano di fare. Il loro scopo è quello di consentire di scrivere funzioni che verranno analizzate come le funzioni built-in di Perl.
Prima di tutto, le chiamate di metodo ignorano completamente i prototipi. Se stai programmando OO, non importa quale prototipo hanno i tuoi metodi. (Quindi non dovrebbero avere alcun prototipo.)
Secondo, i prototipi non sono rigorosamente applicati. Se si chiama una subroutine con &function(...)
, il prototipo viene ignorato. Quindi non forniscono alcun tipo di sicurezza.
In terzo luogo, sono un'azione spettrale a distanza. (Soprattutto il prototipo $
, che causa la valutazione del parametro corrispondente in contesto scalare, invece del contesto elenco predefinito.)
In particolare, rendono difficile passare i parametri dagli array. Per esempio:
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]);
stampe:
a b c
a b
a b c
3
b
a b c
insieme a 3 avvertimenti circa main::foo() called too early to check prototype
(se gli avvertimenti sono attivati). Il problema è che una matrice (o una sezione di matrice) valutata in contesto scalare restituisce la lunghezza della matrice.
Se è necessario scrivere una funzione che funzioni come un built-in, utilizzare un prototipo. Altrimenti, non usare prototipi.
Nota: Perl 6 avrà prototipi completamente rinnovati e molto utili. Questa risposta vale solo per Perl 5.
Anch'io sono curioso. L'unica volta che non li uso è quando sto chiamando con un numero variabile di argomenti. –
Posso raccomandare di leggere l'articolo, ["Perl Prototypes Considerated Harmful"] (http://www.perlmonks.org/?node_id=861966)? – tchrist