Datové typy Na rozdíl od některých programovacích jazyků má Perl relativně malý počet datových typů. Není také možné vytvářet nové abstraktní datové typy jako například v Pascalu. Neznamená to však, že není možné takové věci provést jiným způsobem. Tímto způsobem je použití objektově orientovaného přístupu. I tak se ale v podstatě nejedná o vytvoření nového typu, ale o použití několika málo běžně používaných mechanismů. Datové typy se vztahují jak k literálovým hodnotám, tak i ke konstantám a proměnným. Často je možné hodnoty různých typů zaměňovat bez toho, že by překladač hlásil chybu, jak je tomu v přísně typovaných programovacích jazycích. Proměnné Perl má tři základní tři základní datové typy -- skaláry, pole skalárů a hashe skalárů (asociativní pole). Skaláry jsou základním typem a tvoří se z nich ostatní, složitější datové typy. Uchovávají jedinou hodnotu, kterou je řetězec, číslo nebo odkaz. Pole je uspořádaný seznam skalárů, k jednotlivým hodnotám se přistupuje pomocí číselného indexu (indexy začínají od 0). Hash je neuspořádaná množina dvojic klíč -- hodnota. K hodnotám se zde přistupuje pomocí řetězcových hodnot. Identifikátor proměnné každého typu je uvozen zvláštním znakem. Skalární proměnné začínají znakem $ (připomíná S jako scalar), seznamy začínají znakem @ (připomíná a jako array) a hashe začínají znakem % (připomíná H jako hash). Každý typ proměnné má svůj vlastní jmenný prostor. To znamená, že pro skalární proměnnou je možné použít stejné jméno jako pro proměnnou typu pole nebo hash. Tato jména se pak budou lišit pouze prvním znakem. Jména i hodnoty proměnných jsou ukládána ve dvou typech paměťových struktur. Ty se nazývají tabulky symbolů a lexikální prostory. Tabulky symbolů jsou vztaženy vždy k určitému balíku, lexikální prostory se vztahují k bloku a nemají s tabulkami symbolů nic společného. Více prostoru je tabulkám symbolů věnováno v kapitole o balících. Díky tomu, že jména proměnných začínají speciálním znakem, nemůže se stát, že by se pletla s rezervovanými slovy, jak tomu může být v jiných programovacích jazycích. Tetno problém ale může nastat např. u jmen podprogramů. Jméno proměnné nemusí být vždy známo v době překladu, ale může být určeno až za běhu programu. Toho lze docílit tak, že místo jména proměnné lze použít blok vracející řetězec nebo odkaz. ${'x'} = 1; # pracuje se s proměnnou $x sub jmeno { return 'y'}; ${ jmeno() } = 2; # pracuje se s proměnnou $y $rx = \$x; # odkaz na proměnnou $x ${ $rx } = 123; # pracuje se s proměnnou $x Skalární hodnoty Skaláry obsahují vždy jedinou hodnotu, kterou je řetězec, číslo nebo odkaz na jiná data. Reprezentuje tedy všechny celočíselné typy, typy pracující v pevné i pohyblivé řádové čárce, typy znakové i řetězcové. obsah (kromě odkazu) není blíže specifikován záleží na programátorovi, jak proměnnou použije případné konverze se provádějí automaticky nedefinovaná hodnota, funkce defined a undef logické hodnoty řídíme se pravidly pravdivosti záleží na kontextu, ve kterém pravdivost vyhodnocujeme $x = 1; # $x je pravdivé $x = 0; # $x je nepravdivé $x = "0"; # $x je nepravdivé $x = undef; # $x je enpravdivé @pole = (); # @pole ve skalárním kontextu je ne pravdivé @pole = undef; # @pole ve skalárním kontextu je pravdivé, # protože obsahuje jeden prvek Čísla V Perlu existují čísla celá a čísla desetinná. Číselné hodnoty lze zapisovat několika způsoby. Ve skutečnosti Perl pracuje pouze s čísly reálnými s dvojnásobnou přesností (pokud ovšem nezakážete používání reálných čísel pomocí use integer). Číselné literály 12345 celé číslo kladné -123 celé číslo záporné 123.456 číslo s desetinnou čárkou kladné -123.456 číslo s desetinnou čárkou záporné 1.23E16 v semilogaritmickém tvaru (1.23 krát 10 na 16) -12e34 velké záporné číslo -12e-34 velmi malé záporné číslo 0xFF, 0X2e šestnáctkové číslo 0247 osmičkové číslo 0b111000 binární číslo 1_123_456_789 s podtržítky pro zvýšení čitelnosti 1_12e-1_2 s podtržítky pro snížení čitelnosti Řetězce posloupnosti znaků uzavřené mezi dvojici uvozovek nebo apostrofů minimální a maximální dékla velikost jednoho znaku, use bytes vkládání literály s využitím ordinálních čísel holá slova (barewords) v97.104.111.106 # to samé jako "ahoj" 97.104.111.106 # to samé jako v97.104.111.106 Speciální znaky \n nový řádek \r návrat vozíku \t tabulátor \f nová stránka \b backspace \a pípnutí \e znak ESC \044 znak s ASCII hodnotou osmičkově \0x26 znak s ASCII hodnotou šestnáctkově \0x{262f} znak s ASCII hodnotou šestnáctkově \cC znak CTRL+C \\ znak \ \N{JMENO} znak se zadaným jménem Modifikátory \u převede následující znak na velké písmeno \l převede následující znak na malé písmeno \U převede následující znaky na velká písmena \L převede následující znaky na malá písmena \Q následující nealfanumerické znak uvede obráceným lomítkem \E ukončuje \U, \L, \Q Jiný zápis řetězců Obyčejně Jinak Význam Vkládání '' q// literálový řetězec ne "" qq// literálový řetězec s vkládáním ano () qw// seznam řetězců ano // m// nalezení vzoru ano s/// s/// nahrazení ano y/// tr/// překlad ano "" qr// regulární výraz ano Víceřádkové řetězce print <= 10) { $hex = ('a', 'b', 'c', 'd', 'e', 'f')[$cislo-10]; } else { $hex = $cislo; } $den_v_mesici = (localtime(time))[3]; práce s několika prvky najednou ($sec, $min, $hour) = (localtime(time))[1, 2, 3]; @pole[5..7] = (5, 6, 7); foreach (@pole[5..10]) { # nějaké příkazy } přistupování k jednotlivým prvkům (od začátku i od konce) - kladné nebo záporné číselné indexy délka pole - vyhodnocení pole ev skalárním kontextu, $#pole - hodnota posledního indexu pole vkládání pole do řetězců - hodnoty se spojí obsahem proměnné $" funkce pro praci s poli - push, pop, shift, unshift, splice a od verze 5.12 také each, keys, values Hashe (asociativní pole) hashe jsou složený datový typ, kde k jednotlivým hodnotám se přistupuje pomocí řetězcového indexu, tzv. klíče hodnota hashe může být jakákoliv skalární hodnota, klíčem jakákoliv skalární hodnota mimo odkaz hashové literály %dny = ("1", "pondělí", "2", "úterý", "3", "středa", "4", "čtvrtek", "5", "pátek"); %dny = ( "1" => "pondělí", "2" => "úterý", "3" => "středa", "4" => "čtvrtek", "5" =>"pátek"); přístup k hodnotám hashe, interpretace hashových klíčů - pokud klíč neobsahuje bílý znak, není nutné pro ohraničení použít znaky ' ', případně " ". V některých případech to ale může být na závadu. $hash{shift}; # chápáno jako $hash{'shift'} $hash{shift()}; # v ostatních případech je jako klíč brána návratová hodnota funkce shift $hash{shift @_}; $hash{shift(@_)}; $hash{+shift}; $hash{scalar shift}; vyhodnocení v seznamovém kontextu - seznam klíčů a hodnot (klíč1, hodnota1, klíč2, hodnota2...) vyhodnocení ve skalárním kontextu - řetězec obsahující informaci o počtu alokovaného prostoru a zabraného prostoru hashe (např. 3/16 znamená, že jsou zabrány 3 ze 16 alokovaných jednotek) funkce pro práci s hashi (keys, values, each, exists, delete) Ovladače souborů co to jsou ovladače propojení ovladače a souboru - funkce open a podobné standardní ovladače STDIN, STDOUT, STDERR bude zmíněnno později $FILE = "soubor.txt" open FILE; print FILE "text"; Formáty Formáty slouží k vytváření vzhledově přívětivých výstupů. Výstupy jsou dány definicí formátu pomocí funkce format. Každý formát má své jméno odděleno od jméno ostatních typů objektů. Pokoušíme-li se zapisovat s využitím ovladače pomocí funkce write, vyhledá se formát, který má stejné jméno jako ovladač, a pomocí něho je výstup upraven. Typegloby typegloby jsou záznamy z tabulky symbolů podobně se tím budeme zabývat v kapitole Balíky