Beenden einer Iteration einer Schleife aus einer Subroutine

7

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:

  • Verwendet 'next;' in einem Unterprogramm auf diese Weise in Ordnung, oder ist es gefährlich / schlechte Praxis?
  • Gibt es eine bessere Möglichkeit, den Rest der Iteration von einer Subroutine zu überspringen?
  • Wenn es in Ordnung ist und es keinen besseren Weg gibt, gibt es eine Möglichkeit, die Warnung zu unterdrücken?
CarrieVS 12.09.2014, 12:16
quelle

5 Antworten

8

Es ist einfach, die Warnung zu unterdrücken. Platziere einfach die folgende Zeile über deinem next :

%Vor%

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.

    
tobyink 12.09.2014 12:59
quelle
6

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

    
jm666 12.09.2014 12:43
quelle
4

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:

%Vor%

(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.)

    
thb 12.09.2014 12:23
quelle
3

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,

%Vor%     
Сухой27 12.09.2014 12:23
quelle
3

Sie können einen Teil / die gesamte Sprungbedingung in das Unterprogramm einfügen, indem Sie truthy zu next und falsey zurückgeben, um mit dem Operator and weiterzumachen.

%Vor%     
marneborn 12.09.2014 16:04
quelle

Tags und Links