Ich habe ein Programm mit einer while-Schleife, das mehrere Punkte hat, wo bestimmte Bedingungen erfordern, dass etwas unternommen wird und dann der Rest der Iteration übersprungen wird.
Da dies immer derselbe Code sein wird, wollte ich ihn in eine Subroutine einfügen, aber wenn ich 'next; Als letzte Anweisung in der Subroutine erhalte ich eine Warnung (Subroutine wird über next at ... beendet), obwohl sie wie vorgesehen zu funktionieren scheint.
d. ohne das Sub:
%Vor%mit sub:
%Vor%Der Rest des Codes im Block / Sub ist so kurz, dass alle außer dem nächsten gesetzt werden; Anweisung in einem Sub-Objekt besiegt ziemlich das Objekt der Verwendung eines Unterprogramms.
Meine Frage ist:
Es ist einfach, die Warnung zu unterdrücken. Platziere einfach die folgende Zeile über deinem next
:
Die Warnung ist aus einem bestimmten Grund da - die Verwendung von next
in einem Hilfssub wie dieser kann für die nächste Person, die den Code lesen muss (wer könnte in 6 Monaten sein!) verwirrend sein, weil next
tritt nicht innerhalb des Schleifenblocks auf. Wenn Sie nur den Schleifenblock lesen, bemerken Sie möglicherweise nicht next
weiter unten in der Datei; und wenn Sie nur die Definition der Subroutine lesen, sind Sie vielleicht nicht sicher, wofür next
ist. Sie müssen beide Teile des Codes zusammen lesen, um einen Sinn daraus zu ziehen. Das macht es verwirrender als die Verwendung von next
direkt in der Schleife.
Außerdem wird die Wiederverwendbarkeit des soeben definierten skip()
-Unters eingeschränkt. Möchtest du skip()
sub in einer anderen Schleife wiederverwenden? Sie sollten besser hoffen, dass die Skip-Logik in der neuen Schleife noch Sinn macht.
Wenn Sie all das in Erwägung gezogen haben und trotzdem weitermachen möchten, deaktivieren Sie einfach die Warnung, wie oben gezeigt. Warnungen sind keine Fehler, sie sind nur Warnungen. Deshalb werden Warnungen als "Warnungen" bezeichnet. Sie sollen Ihre Aufmerksamkeit auf etwas lenken, was möglicherweise problematisch ist. dich nicht davon abzuhalten, etwas zu tun, von dem du dich entschieden hast, ist nützlich.
Aus der Learning perl, 6. Ausgabe, Seite 179 (Fußnote)
Es ist wahrscheinlich keine gute Idee, aber Sie könnten diese Schleifensteuerung verwenden Operatoren innerhalb einer Subroutine, um eine Schleife zu steuern, die sich außerhalb befindet das Unterprogramm. Das heißt, wenn ein Unterprogramm in einem Schleifenblock aufgerufen wird, und das Unterprogramm wird zuletzt ausgeführt, wenn kein Schleifenblock läuft Innerhalb des Unterprogramms springt der Ablauf der Steuerung direkt nach dem Schleifenblock im Hauptcode. Diese Möglichkeit zur Verwendung der Schleifensteuerung von innerhalb einer Subroutine kann in einer zukünftigen Version von Perl weggehen, und nein man wird es wahrscheinlich vermissen.
Die Lösung könnte sein, was andere bereits gesagt haben, oder Sie können einen zusätzlichen Test im Sub durchführen, wie
%Vor%für das
%Vor%druckt:
%Vor% z.B. übersprang alle übereinstimmenden 2
, aber nicht 20
Ihr Warninstinkt ist wahrscheinlich richtig. Wie du sagst, ist next
einfach nicht die Art von Anweisung, die man in ein Unterprogramm einfügt. Auch wenn Sie es nicht bevorzugen, ist dies fast sicher besser:
(Ich habe eine ziemlich entspannte Haltung gegenüber nicht standardmäßigen Programmiertechniken, besonders wenn sie nicht überstrapaziert werden. Wenn Sie in diesem Fall die next
einbetten möchten, dann werde ich nicht mit Ihnen streiten, da es Ihre ist Trotzdem, da Sie um Rat gefragt haben, stimme ich Ihrem Instinkt zu, dass das Einbetten der next
wahrscheinlich keine gute Idee ist.)
Warnungen warnen nicht, wenn dies eine gute Vorgehensweise ist. Verwenden Sie Ihre Funktion so, dass sie früher als next
zurückkehrt. Sie können nach dem Funktionsergebnis suchen und entscheiden, ob Sie zur nächsten Iteration springen oder bedingungslos zur nächsten Iteration übergehen möchten,
Tags und Links perl loops subroutine