Stavba jazyka - stručný přehled

Perl nemá žádný prostředek, pomocí kterého se vytvářejí programy (jako např. vývojové prostředí pro Turbo Pascal nebo C). Program v Perlu je obyčejný text, obsahující písmena, číslice, bílé znaky a některé speciální symboly. je možné ho tedy vytvářet v libovolném textovém editoru. V systémech UNIX tedy například editorem vi, pico či joe, ve Windows editorem Notepad, WordPad či TexPad. Je důležité, aby se jednalo o čistý text, který neobsahuje nějaké řídící znaky příslušného editoru.

Perl byl navržen lingvistou Larry Wallem, proto má určitou podobnost s přirozeným jazykem (angličtinou). Zápis programu v Perlu je proto většinou poměrně snadno čitelný i pro obyčejného člověka, který se programováním nezabývá.

Tak jako v přirozeném jazyce existují slovní druhy (podstatná jména, slovesa), stejně tak i v Perlu existují jejich ekvivalenty. Podobně, jako lze v přirozeném jazyce jednu věc vyjádřit několika způsoby a nějaké sdělení může mít různý význam v závislosti na kontextu, v jakém bylo proneseno, i v Perlu je tomu právě tak. Můžeme říci:"Jestliže dělitel není nula, prověď podíl." Můžeme ale teké říci: "Prověď dělení, ale pouze v případě, že je dělitel různý od nuly." Výsledek je pokaždé stejný, ale sdělení bylo řečeno pokaždé trochu jinak. Neexistuje striktně daná syntaxe, je možné používat různá zjednodušení a zkracování zápisu, Perl se snaží porozumět tomu, co jsme napsali. Nic ale nebrání tomu, abychom dodržovali určitá pravidla, která učiní kód snadno čitelný a podobný jazykům s přesně danou strukturou a syntaxí.

Perl může být jazykem jednoduchým, snadným pro vyjadřování. Není třeba znát mnoho, aby bylo možné psát jednoduché i složitější programy. Při dalším postupném rozšiřování znalostí je možné pouštět se do složitých programů, které pracují s databází, využívají síťovou komunikaci či komunikují s uživatelm pomocí grafického uživatelského rozhranní.

Podobně jako přirozený jazyk Perl umí věci vyjadřovat přímo, bez zbytečných přívlastků, které zamlžují původní sdělení. Podobně jako v přirozeném jazyce lze věci vyjádřit velmi komplikovaně tak, že je téměř nemožné zápis programu rozluštit.

Jak již bylo řečeno, Perl je jazyk volný a při psaní programů není třeba se zatěžovat zbytečnostmi. Existuje řada mechanismů, které se provádějí implicitně či jsou předpokládány nebo očekávány. Není ale chybou, pokud tyto věci sdělíme Perlu explicitně. Je to spíše otázkou osobního vkusu a lenosti. Není například nutné provádět deklarace proměnných, nutně psát při každém volání funkce závorky okolo argumentů, v řadě míst se implicitně používají předdefinované proměnné. V některých jiných programovacích jazycích jsou takové věci nezbytně nutné pro syntaktickou správnost programu (např. jazyk Pascal, C).

Když chcete napsat program, který na obrazovku vytiskne pozdrav "Ahoj", stačí, aby celý program obsahoval jeden řádek.

print "Ahoj";

Úplně stejným způsobem by se toto vyjádřilo v běžném jazyce. Není třeba provádět různé deklarace, říkat, kde začíná a končí tělo programu.

Důležitou vlastností jazyka je, že rozlišuje mezi malými a velkými písmeny. Děje se tak nejen v řetězcích či řetězcových literálech, ale i u identifikátorů (tzn. u jmen proměnný, podprogramů, modulů apod.). Pokud tedy někde v programu použijeme proměnnou $Slovo a o kousek dále chceme použít tu stejnou proměnnou, ale napíšeme $slovo, můžeme dostat pro nás neočekávané výsledky. Perl totiž žádnou chybu nezahlásí (pokud zapneme výpis varovných hlášení, je možné že tuto chybu odhalíme. Pokud použijeme striktní režim pomocí use strict, je větší pravděpodobnost, že tuto chybu odhalíme již v době překladu), ale bude pracovat s novou proměnnou, která má jinou hodnotu, než bychom potřebovali. Je to proto, že deklarace proměnných se neprovádí. Proměnné totiž vznikají v místě svého prvního použití. Abychom se vyhnuli takovým problémům, dodržují se určité konvence. Jména proměnných se píší malými písmeny, jména modulů s prvním písmenem velkým, ovladače velkými písmeny atd. Není to nutnost, ale může to odstranit řadu problémů a zvýšit čitelnost programu.

Velkou část programu v Perlu tvoří výrazy. Výraz je posloupnost operandů a operátorů, a má po svém vyhodnocení určitou hodnotu (třeba i nedefinovanou hodnotu). Podle typů operátorů a jejich priority jsou s operandy prováděny různé operace, která ovlivňují výsledek výrazu.

Je-li za výrazem znak středník, stává se z něj příkaz. Protože každý příkaz je i výrazem, má nějakou hodnotu bez ohledu na to, zda je tato hodnota potřebná či nikoliv.

Program v Perlu je tedy posloupnost příkazů -- výrazů oddělených středníkem. Vyhodnocují se sekvenčně, případně opakovaně či podmíněně v závislosti na použitých příkazech cyklu, větvení či skoku. Některé výrazy mají svůj vedlější efekt. Již zmíněný příklad print "Ahoj" je výrazem, jehož hodnota je 1. Jedná se o návratovou hodnotu funkce print. Vedlejším efektem tohoto výrazu je to, že se na standardní výstup vytiskne slovo "Ahoj".

Příkazy mohou být propojeny do bloku. Blok je tedy posloupnost příkazů uzavřených mezi dvojici složených závorek. Poslední příkaz v bloku nemusí být ukončen středníkem. Často je to však doporučováno, aby nedošlo k chybě nebo k neočekávaným výsledkům v případě, že bychom za tento poslední příkaz chtěli umístit nějaký další. Je-li někde očekáván blok, vždy je tím rozuměna posloupnost příkazů uvnitř složených závorek. Je tomu tak i v případě, že by tento blok obsahoval pouze jediný příkaz.

Blok může mít i své jméno. Jméno se mu může přidělit prostřednictvím návěští. Návěští je řetězec následovaný dvojtečkou. Používá se pro řízení běhu programu pomocí skoků či funkcí pro řízení běhu cyklů. Není nutné, aby návěští pojmenovávalo blok, může se vyskytovat i jinde. Konvencí je, aby se psalo velkými písmeny, aby nedošlo k záměně s rezervovaných slovem.

Blok má i další vlastnosti, se kterými se seznámíme v dalších kapitolách. Koncem bloku například končí platnost balíku či lexikálně vymezených proměnných.

Důležitou součástí programu v Perlu jsou i bílé znaky. Jedná se o znaky jako mezera, tabulátor, znak nového řádku. Tyto znaky jsou při interpretaci ignorovány, nezáleží na tom, zda je někde uveden jeden znak nového řádku nebo je jich sto (výjimkou je použití těchto znaků např. v řetězcovém literálu). Slouží k oddělení symbolů, které by jinak mohly být chápány jako celek. Perl se totiž vždy snaží nalézt co největší část kódu, která by mohla tvořit jeden celek. Objeví-li se například v programu řetězec $promenna, Perl to vždy bude považovat za jméno proměnné, která se jmenuje $promenna. I když by byl správný i název $p, $pr atd.

Bílé znaky mohou také zvyšovat čitelnost programu. Program v Perlu může být klidně napsán na jednom řádku pouze s tolika bílými znaky, kolik je nezbytně nutné. Vhodné odřádkování a odsazování však může podstatným způsobem program zpřehlednit a zjednodušit tak případné úpravy.

Další součástí programu jsou komentáře. Nejsou nezbytné, ale jejich použití je nanejvýš vhodné. Nejsou přímou součástí programu, při interpretaci se ignorují. Zvyšují přehlednost programového kódu a vysvětlují význam použitých konstrukcí. Začínají znakem # a pokračují až do konce řádku.

Víceřádkové komentáře začínají slovem, jehož první znak je =, a končící slovem =cut (oba tyto symboly musejí začínat na začátku řádku a za nimi nesmí již nic následovat). Tyto komentáře jsou rovněž považovány za jakýsi druh dokumentace, zvaný Plain Old Documentation. Různými programy lze tyto texty ze skriptu vyextrahovat a vyrobit z nich text, manuálové stránky, HTML text, či dokument v LaTexu.

print "ahoj"; # toto je komentář - příkaz vytiskne ahoj

=komentar
Toto je 
víceřádkový komentář
=cut

Komenář, kdy za znakem # následuje vykřičník, určuje, kterým programem má být skript zpracováván, pokud není předán jako argument perlovému interpretu, ale je spuštěn jako spustitelný soubor. V unixových systémech tedy perlový skript bude začínat nějak podobně:

#! /usr/bin/perl -w

Tím je řečeno, že soubor má být předán programu perl v adresáři /usr/bin. Má být rovněž spuštěn s argumentem -w (znamená to vypisování varovných hlášení). Tento řetězec samozřejmě záleží na skutečném umístění interpretu. V operačním systému Windows nejsou takové věci většinou nutné. Windows dokáží program pro zpracování asociovat se souborem na základě jeho přípony.

Navíc program v Perlu může obsahovat i speciální řídící symboly, jako __FILE__, __LINE__, __PACKAGE__, __END__, __DATA__. Jejich použití není příliš časté a je zmíněno později.

Objekty v Perlu mají svá pojmenování -- identifikátory. Při vytváření jmen se v úvahu berou malá a velká písmena. Jména začínající písmenem nebo podtržítkem mohou mít libovolnou délku (minimálně je zaručeno 255 znaků) a mohou obsahovat písmena, číslice a podtržítka. Identifikátory začínající číslicí mohou obsahovat pouze další číslice. Jestliže jméno proměnné začíná jiným znakem, omezuje se často pouze na tento jediný znak. Tyto proměnné mají v Perlu většinou nějaký definovaný význam (např. $$| -- identifikátor procesu, $" -- oddělovač seznamových hodnot při vkládání do řetězců...) a jsou jako jediné považovány za globální (není nutná plná specifikace jejich jména). Zvláštím případem je práce se jménem jako s hashovým klíčem v tabulce symbolů. Tento příklad je ukázán v kapitole zabývající se balíky.

Jméno může obsahovat i symbol ::. Tímto symbolem se oddělují jména balíků a jméno balíku od jména proměnné či podprogramu. Konstrukce $Kniha::nazev označuje proměnnou $nazev z balíku Kniha.

Analogií podstatných jmen v Perlu jsou proměnné. Jsou nositelem různých vlastností a tvoří datovou podstatu programu. Mohou obsahovat jednoduchou -- skalární hodnotu (nazývají se skaláry), nebo hodnoty násobné -- seznamové (pole, asociativní pole). Ovladače souborů jsou jména pojmenovávající cosi, co nám umožňuje pracovat se soubory či adresáři. Pomocí formátů je možné definovat výstup z programu. Zvláštním útvarem jsou typegloby, které pojmenovávají všechno, co se jmenuje stejně jako typeglob.

Slovesy jsou podprogramy ať už vestavěné, nebo uživatelem definované. Vykonávají určité akce, často pracují s proměnnými. Tvoří podstatu programu z hlediska prováděných činností. V terminologii jiných programovacích jazyků bývají podprogramy bez návratové hodnoty označeny jako procedury, podprogramy s návratovou hodnotou jako funkce. V Perlu není žádný rozdíl mezi procedurami a funkcemi, neboť v Perlu má všechno nějakou hodnotu. Procedury v pravém slova smyslu tedy neexistují, všechny podprogramy jsou nazývány funkcemi. Záleží pouze na programátorovi, zda návratovou hodnotu podprogramu využije či nikoliv.

Každá proměnná i funkce mají své pojmenování. Pravidla pro vytváření jmen jsou zmíněna v části o proměnných. Jméno skalární proměnné začíná znakem $, jméno pole znakem @, hash %, jménu typeglobu předchází znak * a před jmény funkcí se píše &.

Typickým znakem Perlu je to, že proměnné, podprogramy či ovladače se nemusejí nikde deklarovat ani inicializovat, vznikají až v okamžiku potřeby prvním použitím. Neznamená to, že to v žádném případě nesmíte udělat. Spoustu konstrukcí, zápisů či použití funkcí je možné provést zjednodušeně s využitím implicitních procesů (použití proměnné $_, automatický výběr ovladače STDOUT apod.).

© 2003, František Dařena

Valid XHTML 1.0! Valid CSS!