PowerShell i stringi: parametryzacja

https://xpil.eu/upj

Dziś króciutki przykład jak sparametryzować stringi w PowerShellu. A na koniec deser w postaci operatora Switch.

Parametryzacja stringów polega na tym, że w tekście umieszczamy znaczniki, które następnie są zamieniane na konkretne wartości przez interpreter. A skąd te wartości? Z parametrów, które przekazujemy stringom w specjalny sposób.

Jeżeli ktoś zna C, zapewne kojarzy składnię polecenia printf, gdzie możemy w tekście użyć znaczników typu %d, %s czy %5.2f, które będą zastąpione wartościami podanymi po przecinkach za cudzysłowem zamykającym string. Bardzo podobnie odbywa się to w PowerShell:

"Ala ma {0} kota" -f 1

Powyższy kod wyświetli na ekranie:

Ala ma 1 kota.

Rozbierając ten przykład na części widzimy, że w treści tekstu jest jeden parametr (oznaczony jako {0} - parametry są numerowane od zera), którego wartość przekazujemy za pomocą opcji -f

Może się jednak okazać, że Alicja jest znaną kociarą i ma tych kotów więcej niż jednego. W dodatku ilość kotów może się zmieniać, zarówno w górę jak też w dół. Koleżanki Alicji czasem podrzucają jej swoje koty przed wyjazdem na wakacje, a czasem zdarza się, że któryś z kotów zostaje rozgnieciony na krwawą miazgę przez przejeżdżające pobliską autostradą ciężarówki. Tak czy siak, potrzebujemy ZMIENNEJ, która przechowa nam liczbę kotów Alicji:

$ileKotow = 5
"Ala ma {0} kotów" -f $ileKotow

Powyższy przykład wyświetli:

Ala ma 5 kotów.

Wszystko ładnie i pięknie, ale może się dodatkowo okazać, że Ala jest zajadłą ortofaszystką, co oznacza, że musimy zaprogramować kotom różne końcówki fleksyjne, dzięki którym będą one się ładnie prezentować w bierniku obu liczb. W tym celu wprowadzimy całkiem sympatyczny operator Switch.

Najpierw prosty przykład:

$a = 1
Switch($a) {
	1 {"jeden"}
	2 {"nie jeden"}
}

Wynik:

jeden

Jak widać operator Switch przyjmuje szereg par klucz-wartość, gdzie wartość może być zarówno faktyczną wartością jak też kodem do wykonania - i zwraca wartość (lub wykonuje kod) dla wszystkich dopasowanych kluczy.

Uwaga: napisałem "dla dopasowanych kluczy" - wbrew intuicji sprawdzane są WSZYSTKIE klucze i wykona się kod dla każdego dopasowanego klucza a nie tylko dla pierwszego - przykład poniżej:

$a = 1
Switch($a) {
	1 {"jeden"}
	2 {"nie jeden"}
	1 {"znów jeden"}
}

Wynik:

jeden
znów jeden

Operator Switch w miejscu klucza akceptuje również dowolny kod, którego wynik da się zaliczyć do kategorii prawda - fałsz; tu już możemy zaszaleć i napisać kod dla kota:

Clear-Host
$ileKotow = 1452
$koncowka = $(switch($ilekotow)
	{
		1 {"a"}
		{$_ -ge 5 -and $_ -le 21} {"ów"}
		{$_ % 10 -in (2,3,4)} {"y"}
		default {"ów"}
	}
)
"Ala ma {0} kot{1}" -f $ileKotow,$koncowka

(powyższy kod okazał się ssać niczym radziecki odkurzacz, nie działał poprawnie dla 12, 13 oraz 14 - na szczęście jeden z Czytelników wykazał się czujnością i wypunktował błąd - poniżej poprawiona wersja)

Clear-Host
$ileKotow = 22
$koncowka = $(switch($ilekotow)
	{
		1 {"a"}
		2 {"y"}
		3 {"y"}
		4 {"y"}
		{$_ -ge 5 -and $_ -le 21} {"ów"}
		{$_ % 10 -in (2,3,4) -and $_ -ge 21} {"y"}
		default {"ów"}
	}
)
"Ala ma {0} kot{1}" -f $ileKotow,$koncowka

Jak widać nasz końcowy string ma tym razem dwa parametry: {0} to ilość kotów, a {1} to końcówka, jaką należy dodać do słowa "kot" żeby otrzymać poprawną formę biernika.

Logika jest następująca: jeżeli kot jest tylko jeden, dodajemy literkę "a" ("kota"). Jeżeli kotów jest co najmniej pięć, ale nie więcej niż dwadzieścia jeden, poprawna końcówka to "ów" ("kotów"). Jeżeli ostatnia cyfra to 2, 3 lub 4 wówczas końcówka brzmi "y" ("koty"). We wszystkich pozostałych przypadkach (a więc: więcej niż 21 oraz ostatnia cyfra inna niż 2, 3 lub 4) końcówka brzmi "ów".

Ustawiamy teraz eksperymentalnie zmienną $ileKotow na różne wartości całkowite i sprawdzamy wyniki:

Ala ma 1452 koty
Ala ma 1450 kotów
Ala ma 75890233 koty
Ala ma 1 kota

I to tyle na dziś.

https://xpil.eu/upj

6 komentarzy

    1. Gorzej! W takim przypadku zwracana jest lista, czyli efekt końcowy jest taki:

      Ala ma 12 kotSystem.Object[]

      Poprawka w przygotowaniu 😉

  1. Spojrzałem na tytuł i już miałem nadzieję na jakiś porządny wpis o robotach i seksie, a tutaj znów jakieś nudy…. Ech 😉

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.