Powershell 7: eksperymentujemy #2

https://xpil.eu/9gv

Dziś drugi wpis z serii nowinek w nowym Powershell. Tym razem weźmiemy na tapet operator trójargumentowy zwany czasem operatorem warunkowym (po naszemu: ternary operator). Czyli pytajnik z dwukropkiem.

Operator ów to nic innego jak sprawdzenie jakiegoś warunku, a następnie zwrócenie wartości X jeżeli warunek ów jest prawdziwy bądź też Y jeżeli nie jest.

Przykład:

$c = $a -eq $b ? 3 : 4

Powyższy kod należy rozumieć tak: sprawdź czy $a równa się $b i jeżeli tak, to podstaw za $c trójkę, a jeżeli nie - czwórkę.

Inny przykład:

1..10 | Foreach-Object {$dzien = Get-Random "Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota","Niedziela"; $ma_r = $dzien -like "*r*" ? "$dzien ma R" : "$dzien nie ma R"; $ma_r}

Wynik:

Czwartek ma R
Niedziela nie ma R
Sobota nie ma R
Sobota nie ma R
Poniedziałek nie ma R
Czwartek ma R
Niedziela nie ma R
Środa ma R
Niedziela nie ma R
Wtorek ma R

Tym razem wylosowaliśmy sobie losowo dziesięć razy nazwę dnia tygodnia i sprawdziliśmy każdorazowo czy nazwa ma w środku literę R czy nie (dlaczego? Bo "Niedzierla", jak mówi stary kawał).

Implementacja operatora trójwartościowego w Powershell 7.0 jest dość "goła":

Po pierwsze, nie da się użyć wyniku operatora w charakterze zmiennej (innymi słowy nie da się podstawić do wyniku operatora żadnej wartości). W C jest to jak najbardziej możliwe:

( x > y ? a : b) = 7

Powyższy kod w C podstawi siódemkę do zmiennej a jeżeli x>y, w przeciwnym razie do b. W Powershell podobny zabieg skończy się komunikatem o błędzie składni

Po drugie zaś powershellowa wersja nie obsługuje składni "skróconej"; w C możemy napisać:

a = b ?: c

Tu z kolei jeżeli b jest prawdą, wartość zmiennej a nie zmieni się, a jeżeli nie, podstawimy tam wartość zmiennej c. Innymi słowy powyższa linijka jest równoważna:

a = b ? a : c

W Powershell użycie składni "skróconej" nie przejdzie - również zostaniemy opluci komunikatem błędu.

Wniosek końcowy: pomimo niepełnej implementacji operatora trójwartościowego mamy od teraz okazję skrócenia tego:

if($a -ne $b) {$x = 7} else {$x = 9}

Do tego:

$x = $a -ne $b ? 7 : 9

Prawda, że prościej?

https://xpil.eu/9gv

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.