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