Opakování Co je výsledkem následujícího prográmku? my $a="kol"; my $b="o"; $a.= $b; $b.= $a; print "a = $a, b = $b\n"; Vkládání speciálních znaků? Uvozovací znaky
Operátor opakování x počet opakování předchozího řetězce print "POZOR! "x3, "\n"; print "Balonky na poušti:\nPozor kaktu"."s"x9,"\nCo říká"."š"x16,"\n"; Cvičení Použít u přímých kaktusových řečí uvozovky Použít u přímých kaktusových řečí uvozovky Uživatelem zadaný počet opakování s a š. Uživatelem zadaný počet opakování s a š.
Modifikátory - převod řetězců \unásledující písmeno na velké (upper) \lnásledující písmeno na malé (lower) \Unásledující skupina písmen na velká \Lnásledující skupina písmen na malá \Qpřed nealfanum. znaky v násl. skupině předsadí \ \Eukončuje skupinu pro \U, \L, \Q
Nejpoužívanější funkce na řetězcích chop - odstraní poslední znak řetězce chomp - odstraní konec řádku na konci řetězce length - počet znaků v řetězci uc / lc - převede na velká / malá písmena ucfirst / lcfirst - převede první písmeno na velké / malé chr(číslo) - vydá znak s daným kódem
Vyhledávání v řetězci index / rindex (kde, co, odkud) Hledá první / poslední výskyt řetězce co v řetězci kde. Výsledkem je index (pořadové číslo) prvního znaku nalezeného podřetězce Nenalezne-li se, výsledek je -1. Čísluje se od nuly ! Parametrem odkud můžeme zadat, od které pozice se má začít hledat, implicitně 0. $zacatekLesa = index("polesí","les") + 1;
substr(kde, odkud, kolik, nahraď) podřetězec kde - řetězec, z kterého se vybírá odkud - počáteční index v řetězci (od 0) - záporný se počítá od konce kolik - kolik znaků se má nahradit. - Chybí-li, vezme se zbytek do konce řetězce. Je-li záporný, tolik znaků zbyde do konce řetězce nahraď - řetězec, kterým se vybrané znaky nahradí substr("polesí",2);substr("polesí",2,3); substr("polesí",-4);substr("polesí",0,-2);substr("polesí",-3,-1);
Zaměňování podřetězců $x = "polesí"; substr($x,2,3,"vznáš"); výstupem je "les", ale v proměnné x je "povznáší" Jinak: substr($x,2,3) = "vznáš"; substr("polesí",-2,2,"z");.. chyba - pokus změnit konstantu! substr($x,-2,2,"z"); ?Co je výstupem, co v proměnné x?
Podmíněný příkaz Obecný běh programu: příkaz Větvení programu: podmínka blok 1blok 2 anone Příklad Podmínka: Budeš hodný? Ano: Dostaneš zmrzlinu Ne: Dostaneš na zadek
Pravda x nepravda Nepravda číslo 0 prázdný řetězec řetězec "0" prázdný seznam () nedefinovaná hodnota Pravda všechno ostatní, tedy i řetězec "0.0" mezera " " Standard: 1
Porovnávání hodnot - čísla Výsledek: nedefinovaná hodnota v případě nepravdy, 1 v případě pravdy print "Je 5 větší než 7?", 5>7, "\n"; print "Je 6 rovno 6?", 6==6, "\n"; print "2 není rovno 3?", 2!=3, "\n"; == rovnost != nerovnost > větší než < menší než >= větší nebo rovno než <= menší nebo rovno než Operátor -1 je-li a<b $a $b Výsledek 0 je-li a==b 1 je-li a>b
Porovnávání hodnot - řetězce eq - rovnost lt - menší než (less than) ne - nerovnost gt - větší než (greater than) ge - greater than or equal le - less than or equal print "Je pes větší než kočka?, "pes" gt "kočka", "\n"; print "Je kráva menší než kůň?, "kráva" lt "kůň", "\n"; Lze porovnávat i ASCII hodnoty pomocí funkce ord: Operátor cmp - obdobný ale pro řetězce print "Je ^ větší než %?, ord("^") > ord("%"), "\n";
Porovnávání smíšených hodnot ? Co se stane, když ? print "První porovnání: ", "sedm" eq "osm", "\n"; ? print "Druhé porovnání: ", "sedm" == "osm", "\n"; ? print "Třetí porovnání: ", "7" == "sedm", "\n"; ? print "Čtvrté porovnání: ", "7" eq "", "\n"; Číslo na začátku řetězce se zkonvertuje na číslo, zbytek řetězce se ignoruje Nečíslo na začátku řetězce => celý řetězec se zkonvertuje na 0 "4a" 4 "034 67" 34 "a250" 0
Logické operátory && konjunkce || disjunkce ! zápor and or not xor POZOR na priority: Operátory v levé části mají větší prioritu než ty v pravé. RADA: Dávat výrazy do závorek, když si nejsme jisti. (I když jsme!! Je to většinou čitelnější)
Přednost (precedence) ** ! * / % x + -. = lt gt ge le == != eq ne cmp && ||, not and or xor Stejně je lepší používat závorky !!!
Příklady #!/usr/bin/perl use warnings; print "1: ", 6 > 3 && 3 > 4, "\n"; print "2: ", 6 > 3 and 3 > 4, "\n"; Co je výstupem z tohoto programu? ** ! * / % x + -. = lt gt ge le == != eq ne cmp && ||, not and or xor
Příkaz if $heslo = "sluníčko"; print "Napiš heslo:"; $h = ; chomp $h; if($heslo eq $h) {print "Trefa!\n";} else {print "Máš smůlu.\n";} Blok příkazů if (podmínka) { } elsif (podmínka) { } elsif (podmínka) { } else { } if(1) {print "To máme dnes ale hezky.\n";} else {print "Dnes je ošklivo.\n";}
Příkaz "if" - alternativy if (podmínka)... už známe if (podmínka)... totéž, ale nelze blok Příkaz se provede, když není splněna podmínka: unless (podmínka) if(not(podmínka)) and Příkaz 2 se provede, jestliže výsledkem první podmínky byla "pravda" or Příkaz 2 se provede, jestliže výsledkem první podm ínky byla "nepravda"
Cykly příkaz podmínka ne příkaz ano Nekonečný cyklus! – POZOR !! while("dokud je hezky") {print "Je hezky\n";}
Cyklus while while(podmínka) {blok příkazů} Dokud platí podmínka, provádějí se příkazy v bloku. until(podmínka) {blok příkazů} Dokud neplatí podmínka, provádějí se příkazy v bloku. Příklad: sčítání čísel od 1 do N $N = ( ); $NN = $N; $soucet = 0; while($N > 0) { $soucet += $N--; } print "Výsledek sčítání od 1 do $NN je: $soucet.\n";
while jinak do { blok příkazů } while (podmínka) Skoro ekvivalentní předchozímu zápisu, ALE podmínka se vyhodnocuje až na konci => blok příkazů se VŽDY aspoň jednou provede! POZOR!! $N =$NN= ( ); $soucet = 0; do { $soucet += $N--; } while($N > 0) print "Výsledek sčítání od 1 do $NN je: $soucet.\n";
Řízení cyklů Podmínka – hlavní ovládací prvek Do provádění cyklu lze zasáhnout i jinak: last = okamžité ukončení cyklu pokračování za cyklem next = vynechání zbytku těla cyklu pokračování na začátku cyklu novým vyhodnocením podmínky redo = vynechání zbytku těla cyklu pokračování na začátku cyklu bez vyhodnocení podmínky
Proměnná $_ Aktuální proměnná Použití při čtení dat Konstrukce while( ) opakovaný vstup od uživatele to, co uživatel zadá, se zapíše do proměnné $_ Vynechá-li se u některých (mnoha) funkcí argument, dosadí se automaticky proměnná $_ - výhoda i nebezpečí while( ) # do $_ se zapíše vstup {chomp; # odtrhne se \n z proměnné $_... další příkazy }