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艣.
A ile b臋dzie dla 12? (Ja si臋 domy艣lam 偶e ’12 kot贸wy’) 馃槈
Gorzej! W takim przypadku zwracana jest lista, czyli efekt ko艅cowy jest taki:
Ala ma 12 kotSystem.Object[]
Poprawka w przygotowaniu 馃槈
… i poprawione. Nie ma to jak debugowanie blogowaniem, panie.
馃榾 Jasne, co 2 g艂owy to nie 3 (czy jako艣 tak)
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 馃槈
Wuwuwu robotube dot kom (kolega opowiada艂…)