Das Problem ist, dass Perls Funktions-Prototypen nicht das tun, was die Leute denken. Ihr Zweck ist es, Ihnen zu ermöglichen, Funktionen zu schreiben, die wie Perls eingebaute Funktionen analysiert werden.
Zunächst ignorieren Methodenaufrufe Prototypen vollständig. Wenn Sie OO-Programmierung machen, ist es egal, welchen Prototyp Ihre Methoden haben. (Sie sollten also keinen Prototyp haben.)
Zweitens werden Prototypen nicht streng durchgesetzt. Wenn Sie ein Unterprogramm mit &function(...)
aufrufen, wird der Prototyp ignoriert. Sie bieten also keine Art Sicherheit.
Drittens sind sie gruselige Action-at-distance. (Insbesondere der Prototyp $
, der bewirkt, dass der entsprechende Parameter im skalaren Kontext anstelle des standardmäßigen Listenkontexts ausgewertet wird.)
Insbesondere machen sie es schwierig, Parameter von Arrays zu übergeben. Zum Beispiel:
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]);
druckt:
a b c
a b
a b c
3
b
a b c
zusammen mit 3 Warnungen über main::foo() called too early to check prototype
(wenn Warnungen aktiviert sind). Das Problem besteht darin, dass ein Array (oder Array-Slice), das im skalaren Kontext ausgewertet wird, die Länge des Arrays zurückgibt.
Wenn Sie eine Funktion schreiben müssen, die sich wie eine integrierte Funktion verhält, verwenden Sie einen Prototyp. Andernfalls verwenden Sie keine Prototypen.
Hinweis: Perl 6 wird komplett überarbeitete und sehr nützliche Prototypen haben. Diese Antwort gilt nur für Perl 5.
Ich bin auch neugierig. Die einzige Zeit, die ich sie nicht benutze, ist, wenn ich mit einer variablen Anzahl von Argumenten aufrufe. –
Darf ich Ihnen empfehlen, den Artikel ["Perl Prototypes Considered Harmful"] (http://www.perlmonks.org/?node_id=861966) zu lesen? – tchrist