Calocybe: perl 5.6: [functionname] called too early to check prototype

Beitrag lesen

Hi Christian!
(Schoen, dass sich doch noch jemand mit Perlkenntnissen eingeschaltet hat. ;-))

Nee, wars nicht ;-) Der relevante Teil war im Grunde der Head.

Mmh? Den Funktionskopf mit Prototyp hatte ich doch gepostet.

Ah, der Fehler ist klar.

Find ich noch nicht. ;-)

Auch Perl arbeitet Zeilenweise; wenn du eine
Funktion aufrufst, bei der ein Prototype-Check gemacht werden muss,
und sie wurde vorher noch nicht definiert (durch eine
Forward-Deklaration), kann der Prototyp eben nicht geprueft werden.

Soweit hab ich mir das ja auch gedacht.

Da du die Funktion (in sich selbst)
aufrufst, bevor sie komplett analysiert wurde, wird halt dieser
Fehler erzeugt.

Hier bin ich nicht einverstanden. Dort wo der Aufruf steht, hat Perl den Prototyp bereits gesehen, also kann es ihn auch pruefen. Die Semantik des Prototyps aendert sich doch nicht mehr durch die Definition der Funktion. Und wenn es so waere, wie Du sagst, dann duerfte Perl ja auch nicht wissen, dass es ueberhaupt einen Prototypen gibt, gegen den es pruefen muss. Also entweder es hat ihn gesehen und weiss dass es einen gibt und kann dagegen pruefen, oder es hat ihn nicht gesehen, kann dann auch nicht pruefen, aber kann auch keine Warnung ausgeben, weil nicht bekannt ist, dass es einen Prototypen gibt.

Die Loesung ist auch ganz einfach: oben am Script (am besten direkt
nach dem Einbinden eventueller Module) forward-Deklarationen
benutzen.

Naja, Workarounds hab ich genug in der Hosentasche, daran soll's nicht scheitern. ;-) Habe mich nun doch fuer die Forwarddeklaration entschieden und direkt davor hingeschrieben, aber sinnvoll finde ich das nicht. ;-)

So long