Ich habe eine Perl-Datei wie folgt:
%Vor% Kurz gesagt, f1
wird aufgerufen, bevor es definiert wird. Perl gibt also eine Warnung aus: "f1 hat zu früh aufgerufen, um den Prototyp zu überprüfen". Das gleiche gilt für f2
. Das einzige Unterschied ist, dass es von einer anderen Subroutine aufgerufen wird. Es wird keine Warnung für f2
ausgegeben. Warum?
Was ist der beste Weg, um dieses Problem zu lösen?
&f1();
Sie können dieses Problem vollständig vermeiden, indem Sie zunächst keine Prototypen verwenden:
%Vor%Verwenden Sie keine Prototypen , wenn Sie nicht wissen, warum Sie sie verwenden:
Das ist natürlich alles sehr mächtig und sollte nur in Maßen verwendet werden, um die Welt zu einem besseren Ort zu machen.
Entfernen Sie einfach die () aus Ihren Unterprogrammdefinitionen. Wenn Sie mit () definieren, denkt Perl, dass dies Prototypen sind, und Sie müssen Ihren Prototyp definieren, bevor Sie ihn verwenden.
Probieren Sie das ......
aus %Vor% Das Fehlen einer Warnung beim Aufruf von f2()
von f3()
scheint ein Fehler zu sein.
Dies druckt "a". Wenn Sie f2()
vordefinieren oder die Reihenfolge der Unterprogrammdefinitionen vertauschen, wird "ARRAY (0x182c054)" ausgegeben.
Um die Situation zu lösen, kommt es darauf an. Meine Einstellungen (in der Reihenfolge) wären:
&foo()
auf, um die Überprüfung des Prototyps zu umgehen. Wenn Sie es mit der Klammer nennen, warum verwenden Sie sogar Prototypen?
%Vor%Die einzige Zeit, die ich den leeren Prototyp verwenden würde, ist für eine Subroutine, die ich wie eine Konstante arbeiten möchte.
%Vor%Ich würde tatsächlich empfehlen, keine Perl-5-Prototypen zu verwenden, es sei denn, Sie möchten, dass sich Ihre Subroutine anders verhält als sonst.
%Vor%In diesem Beispiel müssten Sie Klammern verwenden, wenn es keinen Prototyp hätte. Sonst hätte es ein zusätzliches Argument bekommen, und die letzte Zeichenfolge würde nie gedruckt werden.
Wenn Sie eine Funktion in Perl definieren, sollten Sie keine Klammern verwenden. Wenn Sie dies tun, erhalten Sie diesen Fehler. Das ist falsch:
%Vor%Dies ist der Weg zu gehen:
%Vor%keine Klammern.
Für detailliertere Erläuterungen siehe Gabor Szabos Perl Maven Seite über Subroutinen und Funktionen in Perl. Ссылка
Tags und Links perl subroutine