Warum bekomme ich in meinem Perl-Code "Warnungen zu früh, um Prototypen zu überprüfen"?

8

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?

  1. Deklarieren Sie das Unterprogramm, bevor es aufgerufen wird
  2. rufe das Sub wie folgt auf: &f1();
user65457 12.11.2009, 05:00
quelle

5 Antworten

14

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.

    
Sinan Ünür 12.11.2009 05:16
quelle
4

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%     
harleygolfguy 06.06.2015 00:26
quelle
2

Das Fehlen einer Warnung beim Aufruf von f2() von f3() scheint ein Fehler zu sein.

%Vor%

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:

  1. Entfernen Sie die Prototypen aus den Unterprogrammdefinitionen. Perls Prototypen tun das nicht was die meisten Leute von ihnen erwarten. Sie sind wirklich nur nützlich, um Subs zu deklarieren verhalten sich wie gebaut. Sofern Sie nicht versuchen, Perls Syntax zu erweitern, verwenden Sie sie nicht.
  2. Vorprogrammieren der Unterprogramme, bevor Sie sie verwenden. Dadurch kann Perl den Prototyp kennenlernen vor dem Treffen irgendwelcher Anrufe.
  3. Ordnen Sie den Code so an, dass die Unterprogrammdefinitionen vor allen Aufrufen angezeigt werden.
  4. Rufen Sie die Subroutinen mit der Notation &foo() auf, um die Überprüfung des Prototyps zu umgehen.
Michael Carman 12.11.2009 14:47
quelle
2

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.

    
Brad Gilbert 12.11.2009 16:12
quelle
0

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. Ссылка

    
Adam Borenstien 24.08.2017 11:59
quelle

Tags und Links