Ucieczka z zagnieżdżonej pętli

https://xpil.eu/1BpED

Pisząc kod w dowolnym języku programowania często gęsto używamy pętli. Czasem owe pętle trzeba pozagnieżdżać. Na przykład pętla zewnętrzna leci po rekordach jakiegoś zestawu danych, a wewnętrzna (zagnieżdżona) - po kolumnach każdego rekordu. Albo zewnętrzna po oddziałach firmy, a wewnętrzna po pracownikach poszczególnych oddziałów.

Co więcej, zagnieżdżenie może być wielopiętrowe, na przykład: województwo -> powiat -> gmina -> miejscowość.

No i teraz klasyczny problem: bardzo często zdarza się, że chcemy wykonać wewnątrz pętli jakąś akcję tylko wtedy, gdy spełnione są pewne warunki - w przeciwnym razie chcemy przeskoczyć do kolejnego elementu pętli zewnętrznej. Scenariusz taki pojawia się na przykład wówczas, kiedy nasz zbiór danych zawiera jakieś łatwo rozpoznawalne elementy testowe i przykładowe, które chcemy pominąć:

("Jan Kowalski", "Beata Malinowska", "Celina Nowak", "Testeusz Testowski", "Przykładyna Przykładowska")

W powyższej liście chcemy wykonać jakąś akcję wyłącznie dla pierwszych trzech użytkowników, pomijając ostatnią dwójkę.

Celem dzisiejszego wpisu jest pokazanie w jaki sposób realizuje się to w PowerShellu:

$users = @(
	"Jan Kowalski"
	, "Beata Malinowska"
	, "Celina Nowak"
	, "Testeusz Testowski"
	, "Przykładyna Przykładowska"
)
$exclusions = @(
	"test"
	, "przykład"
)

:nextUser
foreach ($user in $users) { # pętla zewnętrzna
    foreach($exclusion in $exclusions) { # pętla wewnętrzna
        if($user.ToLower().Contains($exclusion.ToLower())) {
            continue nextUser
        }
    }
    # ten kod wykona się tylko dla użytkowników nie-testowych
}

Magia polega na utworzeniu etykiety, która jest dowolnym słowem poprzedzonym dwukropkiem (tu: :nextUser), a następnie odwołaniu się do tej etykiety operatorem continue. Operator ów, jeżeli nie podamy mu żadnej etykiety, domyślnie "przeskakuje" na kolejny element "najbliższej" pętli bezpośrednio go zawierającej. Gdyby w powyższym kodzie zabrakło nextUser w siedemnastej linii, czyli zostawilibyśmy samo continue, wówczas kod "przeskoczyłby" do kolejnego elementu pętli wewnętrznej. A tak - pomijamy pozostałe iteracje pętli wewnętrznej i od razu przechodzimy do kolejnego użytkownika.

Ten sam trick zadziała też przy innych rodzajach pętli (while, do, for etc).

Proste?

Proste.

https://xpil.eu/1BpED

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.