Warum Prototypen nur in den seltensten Fällen sinn machen.
Nachdem ich vor einiger Zeit schon mal über einen Sprachwechselfehler in einem meiner Perl Skripte gestossen bin.
Ich hatte eine Funktion wie folgt deklariert:
sub func1() { my $var = shift; ... }
Und der Perl Compiler mäkelte irgendwas vonwegen too many arguments… Klar das () weist Perl an, das diese Funktion keine Parameter bekommen darf. Also das () entfernt und alles war wieder gut.
Objekte und Prototypen
Dann bin ich jetzt über eine Code Stelle gestossen, die folgendermassen als Methode in einem Objekt deklariert war:
sub method1( $ ) { my $self = shift; .... my $var = shift; ... }
Da wollte der Autor wohl festhalten, dass diese Methode nur einen Parameter annimmt, und hat das $var=shift später übersehen, oder hat sich gedacht, $self=shift würde vorher ausgewertet werden. Es ist aber so, dass in Methodenaufrufen die Protoypen ignoriert werden.
Als Funktion aufgerufen macht die method1() aber auch nicht das was sie soll, da $self mit hoher Wahrscheinlichkeit nicht den richtigen Inhlat hat.
Praktisch sind sie aber doch
Zum Beispiel um eine Funktion wie grep nachzubauen:
sub my_grep(&@) { my ($grepper, @list) = @_; my @result = (); foreach (@list) { push @result, $_ if ($grepper->()); } return @result; }
Diese Funktion kann dann wie das eingebaute grep benutzt werden:
my @odd = my_grep { $_[0] % 2 } ( 1 .. 20 );