PowerShell: Sprachkonstrukte (Do/While Schleife, Do/Until Schleife) – Part 17.4
4.4.5 Do/While Schleife
Die Do/While Schleife ist ebenfalls eine konditionale Schleife und verhält sich ähnlich wie die While Schleife.
Do
{ |
Do Schlüsselwort |
<StatementList> } |
Anweisungsblock |
While | While Schlüsselwort |
( <Pipeline>) |
Pipeline zum Testen |
Der Unterschied zwischen den beiden Schleifen besteht darin, dass bei der Do/While Schleife der Anweisungsblock einmal ausgeführt wird, bevor die Bedingung überprüft wird.
4.4.6 Do/Until Schleife
Die Do/Until Schleife ist eine Abwandlung der Do/While Schleife.
Do
{ |
Do Schlüsselwort |
<StatementList> } |
Anweisungsblock |
Until | Until Schlüsselwort |
( <Pipeline>) |
Pipeline zum Testen |
Der einzige Unterschied zu Do/While Schleife besteht darin, dass die Do/Until Schleife die Verarbeitung abbricht, wenn der Test der Pipeline den Wert $True ergibt.
4.4.7 Break, Continue und Labels
Das Schlüsselwort Break erlaubt es, eine Schleife an einer beliebigen Stelle zu verlassen und mit, sich hinter der Schleife befindlichen, Anweisungen fortzufahren. Das Schlüsselwort Continue erlaubt es, von einer beliebigen Stelle innerhalb einer Schleife zum Anfang der Schleife zu springen und den weiteren Iterationsschritt einzuleiten. Beides sind nicht strukturierte Methoden für die Manipulation einer Schleife, dennoch können sie sich in bestimmten Fällen als nützlich erweisen, damit ist die Flusssteuerung innerhalb des Codes noch ein Stück flexibler. Folgendes Beispiel illustriert die Verwendung von Continue und Break:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
1. While ($True) 2. >> { 3. >> $TestNumber = Get-Random -max 100000 4. >> if ($TestNumber -eq 2) {Write-Host "Prime: $TestNumber" ;Continue} 5. >> if ($TestNumber % 2 -eq 0) {Continue} 6. >> for ($i = 3;$i -lt $TestNumber;$i++) 7. >> { 8. >> if (($TestNumber % $i) -eq 0) {Break} 9. >> } 10. >> If ($i -eq $TestNumber) 11. >> { 12. >> Write-Host "Prime: $TestNumber" 13. >> } 14. >> } 15. >> Prime: 3163 Prime: 25033 Prime: 23279 Prime: 91529 Prime: 41177 Prime: 69593 Prime: 19273 Prime: 53089 Prime: 74177 Prime: 11731 Prime: 48187 Prime: 40361 Prime: 1019 Prime: 48157 Prime: 30869 Prime: 47339 Prime: 87853 ... 13. Ctrl + C |
In diesem Beispiel werden fortlaufend Zufallszahlen generiert (Zeile 3) und auf ihre Primeigenschaft hin untersucht. Wenn die Zahl in $TestNumber gleich zwei ist (Primzahl), wird sie direkt ausgegeben. Da weitere Überprüfungen bei zwei sinnlos sind, wird mit Continue ein weiterer Iterationsschritt eingeleitet. Ist die zufällig gewählte Zahl gerade (Zeile 5), wird hier ebenfalls mit Continue der nächste Iterationsschritt eingeleitet. In jedem anderen Fall beginnt die eigentliche Überprüfung auf die Primeigenschaft. Dazu wird versucht, den Wert in *$TestNumber fortlaufend durch natürliche Zahlen größer drei und kleiner $TestNumber zu dividieren und zu schauen, ob das Ergebnis gleich Null ist. In diesem Fall hätte die untersuchte Zahl einen Teiler, der ungleich eins und der Zahl selbst und demnach keine Primzahl wäre. An dieser Stelle wird die For-Schleife ebenfalls mit Break verlassen und der nächste Iterationsschritt beginnt. Läuft die For-Schleife zu Ende, ist eine Primzahl gefunden worden.
Besteht die Notwendigkeit, zwei oder mehrere Schleifen zu verschachteln, gibt es die Möglichkeit, diese bei Bedarf gezielt zu verlassen. Dazu können die Schleifenschlüsselworte mit einem Label versehen werden. Bei der Verwendung von Break kann dann der Name der Sprungmarke angegeben werden, was dazu führt, dass nicht die aktuelle Schleife, sondern die benannte beendet wird. Folgende schematische Darstellung zeigt die Verwendung von Labels:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
:FirstLevel while ($True) { :SecondLevel while ($True) { while ($True) { if ($a) { break } if ($b) { break FirstLevel} if ($c) { break SecondLevel} } Write-Host "After innermost loop" } Write-Host "After SecondLevel loop" } Write-Host "After FirstLevel loop" |
In der innersten While-Schleife wird der Wert der Variablen $a, $b und $c überprüft. Wenn $a = $True, wird die innerste Schleife verlassen und die Schleife mit dem Label „:SecondLevel“ läuft weiter. Wenn $b = $ True ist, wird die Schleife mit dem Label „:FirstLevel“ verlassen (also das gesamte Schleifenkonstrukt). Wenn schließlich $c = $True ist, wird der nächste Iterationsschritt der äußersten Schleife eingeleitet.
* Aus dem rein mathematischen Gesichtspunkt würde es reichen, in diesem Verfahren die For-Schleife lediglich bis zu √$TestNumber laufen zu lassen. Die Berechnung der Wurzel verlangsamt jedoch den Ablauf der Schleife erheblich im Vergleich zu mehr Iterationsschritten in der For-Schleife.