U ´ VOD
• Struc ˇ na ´ historie jazyka
• Za´kladnı ´ vlastnosti Perlu
• Zdroje informacı ´ pouzˇitelny ´ ch pro programova ´ nı ´ v Perlu
• Instalace Perlu a modulu ˚
• Typograficke ´ konvence knihy
Autorem jazyka Perl je sve´ho c ˇ asu syste ´ movy ´ programa´tor a pr ˇ ı ´lezˇitostny ´ lingvista Larry Wall (jeho webova ´ stra´nka ma ´ adresu www.wall.org/˜larry). Ten navrhl jazyk pu ˚ vodne ˇ pro svoji potrˇebu jiz ˇ v roce 1986. Perl meˇl Larrymu nahradit v te ´ dobe ˇ nepostacˇujı´cı ´ prostrˇedky pro zpracova ´ nı ´ textu a da´lkove ´ r ˇ ı ´zenı ´ poc ˇ ı ´tac ˇ u ˚ existujı´cı ´ programove ´ vybavenı ´ nebylo schopne ´ splnit vsˇechny pozˇadavky a tak vznikl mı´sto nove´ho programu novy ´ programovacı ´ jazyk. Jako jme ´ no bylo po dlouhe ´ m zvaz ˇ ova ´ nı ´ vybra ´ no slovo Perl. Je to zkratka z anglicky ´ ch slov Practical Extraction and Report Language nebo take ´ Pathologicaly Eclectic Rubbish Lister.∗
Uvolne ˇ nı ´ interpretu jazyka pro verˇejnost v roce 1987 se setkalo s necˇekany ´ m ohlasem. Tato odezva vedla Larryho a jeho spolupracovnı´ky k dals ˇ ı ´mu obohacova ´ nı ´ jazyka z na´stroje pro zpracova ´ nı ´ textu ˚ se vyvinul „skutec ˇ ny ´ programovacı ´ jazyk“ s ladı´cı´mi na´stroji (debuggery), kompila´tory, rozsa´hlou sı´tı ´ knihoven, dokumentace, podpu ˚ rny ´ ch programu ˚ atd. V soucˇasnosti se vy ´ voji a rozsˇir ˇ ova ´ nı ´ jazyka veˇnuje kolektiv lidı´, kter ˇ ı ´ si r ˇ ı ´kajı ´ Perl Porters, a Larry Wall stojı ´ v jeho cˇele.
Pu ˚ vodne ˇ byl Perl navrz ˇ en pro platformu s operac ˇnı´m syste ´ mem UNIX, ale v souc ˇ asne ´ dobe ˇ be ˇ z ˇ ı ´ take ´ na jiny ´ ch syste´mech, jako je napr ˇ MS Windows, VMS, OS/2, Macintosh, MS DOS, Atari, Novell aj.† Patr ˇ ı ´ k nejprˇenositelneˇjs ˇ ı ´m jazyku ˚ m, ktere ´ v soucˇasnosti existujı´, a dnes patr ˇ ı ´ take ´ ke vsˇeobecne ˇ uzna ´ vane ´ mu standardu pro vyvı´jenı ´ webovy ´ ch aplikacı´.
Programa´torˇi jazyka C ocenı ´ pome ˇ rne ˇ velkou podobnost s tı´mto jazykem, prvky svy ´ ch programovacı´ch jazyku ˚ zde naleznou take ´ programa´torˇi v jiny ´ ch jazycı´ch nebo tvu ˚ rci shell skriptu ˚ . Funkcˇnost konstrukcı ´ v Perlu a ostatnı´ch programovacı´ch jazycı´ch je veˇtsˇinou stejna ´ nebo velmi podobna ´ . ‡
V soucˇasnosti je rozs ˇ ı ´r ˇ ena ´ verze Perlu r ˇady 5 (v cˇervenci roku 2004 byla uvolne ˇ na verze 5.8.5.§), ktera ´ umoz ˇ n ˇ uje mj. objektove ˇ orientovane ´ programova ´nı´, programova ´ nı ´ ve vı´ce soube ˇ z ˇ ny ´ ch vla´knech cˇi rozsˇir ˇ ova ´ nı ´ jazyka formou samostatny ´ ch modulu ˚ . Jiz ˇ neˇkolik let probı´ha ´ paralelne ˇ s vy ´ vojem Perlu r ˇady 5 novy ´ Perl verze 6. Ten nenı ´ pouhy ´ m pr ˇ epsa ´nı´m Perlu 5, dojde ke zme ˇ ne ˇ neˇktery ´ ch pr ˇ ı ´stupu ˚ , ale prˇedevs ˇ ı ´m se zde uplatn ˇ uje nova ´ filosofie jsou od sebe oddeˇleny parser, kompila´tor a beˇh programu. Bude tak moz ˇ ne ´ , aby spolupracovaly ru ˚ zne ´ programovacı ´ jazyky. Souc ˇ a´stı ´ strategie tohoto nove´ho jazyka je platformove ˇ neza´visly ´ interpret, zna ´ my ´ pod jme ´ nem Parrot.
V mnoha sme ˇrech je Perl velmi jednoduchy ´ jazyk a nenı ´ trˇeba zna´t mnoho, aby bylo moz ˇ ne ´ psa´t ru ˚ zne ´ i pome ˇ rne ˇ obsa´hle ´ programy s mnoha funkcemi. Tento fakt vsˇak nevylucˇuje, z ˇ e je moz ˇ ne ´ ho vyuz ˇ ı ´t i pro psanı ´ velmi slozˇity ´ ch a velmi rozsa´hly ´ ch
∗ Pu ˚ vodne ˇ se jazyk jmenoval Gloria po Larryho manzˇelce, ale Larry od tohoto pojmenova ´ nı ´ ustoupil. Dalsı´m jmenem bylo slovo Pearl, ovsem i tento pokus byl zamı´tnut, protoze jazyk tohoto jmena jiz existoval.
† Uplny ´ seznam operac ˇnı´ch syste ´ mu ˚ , pro ktere ´ je Perl dostupny ´ , je moz ˇ ne ´ zı´skat na webove ´ adrese http://www.cpan.org/ports/index.html
‡ Existuje vsak nekolik rozdı´lu ˚ , na ktere je treba si davat pozor Jejich seznam, roztrı´deny podle podobnosti k jiny ´ m programovacı´m jazyku ˚ m, se nacha ´ zı ´ v manua ´ love ´ stra ´ nce perltrap. § Pri psanı teto knihy bylo pracovano s verzemi Perlu 5.8 a vyssı´mi (konkretne verze 5.8.0 pro sun4solaris-64int a 5.8.4 pro MSWin32-x86-multi-thread) a i pro verzi 5.8.5 by meˇly by ´ t vesˇkere ´ pr ˇ ı ´klady platne ´
aplikacı´, podporujı´cı´ch pra´ci s graficky ´ m uzˇivatelsky ´ m rozhranı´m, pra´ci s databa ´ zı ´ cˇi sı´t’ovou komunikaci. Je to take ´ jazyk vhodny ´ pro syste ´ move ´ administra´tory (umoz ˇn ˇ uje jednodus ˇ e a efektivne ˇ prova´deˇt u ´ koly zahrnujı´cı ´ zpracova ´ nı ´ textu, pr ˇ ı ´stup k databa ´zı´m a sı´t’ovou komunikaci) a dı´ky dostupnosti na mnoha platforma´ch je vhodny ´ i pro spra ´ vu vı´ceplatformove´ho syste ´ mu.
Velmi silny ´ m na´strojem, ktery ´ nenı ´ be ˇ z ˇ nou souc ˇ a´stı ´ ostatnı´ch programovacı´ch jazyku ˚ , jsou regula ´ rnı ´ vy ´ razy Ty se pouz ˇ ı ´vajı ´ napr ˇ v jednou ´ cˇelovy ´ ch na´strojı´ch pro zpracova ´ nı ´ textu, jaky ´ mi je napr ˇ ı ´klad program awk cˇi v ru ˚ zny ´ ch textovy ´ ch editorech (napr ˇ ı ´klad nejslavneˇjs ˇ ı ´ UNIXovy ´ editor vi). Perlove ´ regula ´ rnı ´ vy ´ razy ve spojenı ´ s konstrukcemi nejzna ´ meˇjs ˇ ı ´ch programovacı´ch jazyku ˚ jsou vsˇak daleko za moz ˇnostmi teˇchto na´stroju ˚ Dals ˇ ı ´ zajı´mavostı ´ Perlu jsou asociativnı ´ pole (be ˇ z ˇ ne ˇ nazy ´ vane ´ hash), coz ˇ jsou mimor ˇ a´dne ˇ vy ´ konne ´ struktury, v nichz ˇ se k pr ˇ ı ´slus ˇ ny ´ m hodnota ´ m prˇistupuje dle programa´torem zvolene´ho r ˇete ˇ zcove´ho klı´c ˇ e.
Perl ma ´ samozrˇejme ˇ i sve ´ stinne ´ stra´nky Prˇedevs ˇ ı ´m v tomto jazyce neexistuje prakticky z ˇ a´dna ´ pevne ˇ definovana ´ syntaxe, prome ˇ nne ´ se nemusı ´ deklarovat, nelze si definovat vlastnı ´ datove ´ typy (jazyk je netypovany ´ ), neexistuje typova ´ kontrola. Nenı ´ to tedy ani vhodny ´ jazyk, jehoz ˇ by bylo moz ˇ ne ´ doporucˇit k vy ´ uce programova ´nı´.
Perl je obvykle implementova ´ n pomocı ´ interpretu, pro spusˇte ˇ nı ´ programu v Perlu tedy potrˇebujete pr ˇ ı ´tomnost interpretu jazyka Perl. Prˇi interpretaci docha ´ zı ´ nejprve k rychle ´ mu prˇekladu zdrojove´ho ko ´ du do pameˇti interpretu a teprve potom k na ´sledne ´ mu provedenı ´ ko ´ du. Tento zpu ˚ sob interpretova ´ nı ´ umoz ˇ n ˇ uje dosa´hnout vysoke ´ prova´de ˇ cı ´ rychlosti prˇi zachova ´ nı ´ be ˇ z ˇ ny ´ ch vy ´ hod interpretovany ´ ch jazyku ˚ rychly ´ vy ´ voj, rychle ´ zme ˇ ny zdrojove´ho ko ´ du, okamzˇite ˇ patrny ´ vy ´ sledek. Znamena ´ to vsˇak, z ˇ e je trˇeba mı´t nainstalova ´ n dals ˇ ı ´ prostrˇedek, ktery ´ program vykona ´ pr ˇ ı ´slus ˇ ny ´ interpret. Prˇi vlastnı ´ prˇedkompilaci do pameˇti se prova´dı ´ kontrola na syntakticke ´ chyby a programa´tor mu ˚ z ˇ e odhalit potencia´lnı ´ proble ´ m i v teˇch c ˇ a´stech programu, ktere ´ interpret obvykle nebude prova´deˇt. I tento pr ˇ ı ´stup zrychluje hladky ´ pru ˚ beˇh vy ´ voje, coz ˇ je souc ˇ asne ˇ nejveˇts ˇ ı ´ pozˇadavek na modernı ´ programovacı ´ na´stroje. V souc ˇ asne ´ dobe ˇ existuje i prˇekladac ˇ Perlu, ktery ´ vytvor ˇ ı ´ bina ´ rnı ´ program nevyzˇadujı´cı ´ interpret.
Distribuce Perlu obsahuje velke ´ mnozˇstvı ´ dokumentace ve forme ˇ tzv. manua´lovy ´ ch stra´nek. V operac ˇnı´ch syste´mech tr ˇ ı ´dy UNIX je prohlı´z ˇ ı ´me nejcˇasteˇji pr ˇ ı ´kazem man, ve Windows je dokumentace dostupna ´ ve forme ˇ HTML stra´nek. Za´kladnı ´ manua´lovou stra´nkou je stra´nka s na ´ zvem perl, ktera ´ obsahuje te´maticky rozcˇlene ˇ ny ´ seznam dals ˇ ı ´ch manua´lovy ´ ch stra´nek. V zac ˇ a´tcı´ch programova ´ nı ´ v Perlu na ´ m mu ˚ z ˇ e pomoci manua´lova ´ stra´nka perlcheat, ktera ´ obsahuje velmi struc ˇ ny ´ popis nejdu ˚ lezˇiteˇjs ˇ ı ´ch konstrukcı ´ jazyka (pra ´ ce s odkazy, metasymboly regula ´rnı´ch vy ´ razu ˚ , specia´lnı ´ prome ˇ nne ´ apod.).
Samotny ´ Perl a veˇtsˇina programove´ho vybavenı ´ je zcela bezplatna ´ ∗ Lze je nale´zt na celosveˇtove ˇ sdı´lene ´ poc ˇ ı ´tac ˇ ove ´ sı´ti s na ´ zvem Comprehensive Perl Archive Network (CPAN), jejı´z ˇ za´kladnı ´ stra´nkou je www.cpan.org. V nas ˇ ı ´ zemi se nacha ´ zı ´ neˇkolik zrcadel sı´te ˇ CPAN, mu ˚ z ˇ eme zmı´nit napr ˇ ı ´klad server MZLU v Brne ˇ ftp.mendelu.cz/perl
∗ Perl podle´ha ´ kombinaci Artistic License a General Public Licence vı´ce informacı ´ lze nale´zt v manualovych strankach perlartistic a perlgpl
nebo server Masarykovy univerzity ftp.fi.muni.cz/pub/CPAN . Na te´to sı´ti naleznete nejen interpret Perlu pro veˇtsˇinu be ˇ z ˇ ny ´ ch platforem, ale take ´ mnozˇstvı ´ dopln ˇ kove´ho software v podobe ˇ knihoven, demoprogramu ˚ , dokumentace apod.
Pro platformu Windows existuje i polokomerc ˇ nı ´ verze jazyka Perl s na ´zvem ActiveState Perl, jejı´z ˇ za´kladnı ´ verze je zdarma a je dostupna ´ na serveru www.activestate.com
1.1 Motto
Motto jazyka Perl, ktere ´ vystihuje jeho podstatu, znı´: „Existuje vı´ce zpu ˚ sobu ˚ , jak ne ˇ cˇeho dosa´hnout.“ (anglicky „There’s more than one way to do it.“)
Perl za ´ roven ˇ podporuje trˇi za´kladnı ´ vlastnosti programa´tora, ktery ´ mi jsou∗:
• lenost,
• netrpeˇlivost,
• pr ˇ ı ´lis ˇ ne ´ sebeveˇdomı´.
1.2
Informac
ˇ nı ´
zdroje
U ´ vodnı ´ branou ke zdroju ˚ m Perlu mu ˚ z ˇ e by ´ t server www.perl.com Tento web je udrz ˇ ova ´ n Tomem Christiansenem, jednou z hlavnı´ch osobnostı ´ spojovanou s Perlem, a nakladatelstvı´m O’Reilly & Associates, ktere ´ vydalo velke ´ mnozˇstvı ´ literatury ty ´kajı´cı ´ se jazyka Perl. Jiny ´ m zdrojem je web www.perl.org udrz ˇ ovany ´ organizacı ´ The Perl Foundation. Nacha´zejı ´ se zde informace ty ´ kajı´cı ´ se jazyka Perl, jeho historie a souc ˇ asne´ho vy ´ voje, uda´lostı ´ vztahujı´cı ´ se k jazyku cˇi odkazy na dokumentaci, knihy a cˇla´nky.
Jazyk Perl ma ´ i svu ˚ j vlastnı ´ cˇasopis. Jmenuje se The Perl Journal, je vyda ´ va ´ n Jonem Orwantem (jeden z autoru ˚ knihy Programming Perl), vycha ´ zı ´ cˇtvrtletne ˇ a bliz ˇ s ˇ ı ´ informace k ne ˇ mu je moz ˇ ne ´ nale´zt na adrese www.tpj.com Kazˇdoroc ˇ ne ˇ je take ´ por ˇ a´da ´ no neˇkolik mezina ´rodnı´ch konferencı ´† zame ˇ r ˇ enı ´ na vy ´ voj cˇi pouzˇitı ´ jazyka.
Dokumentace k Perlu, spolec ˇ ne ˇ s odkazy na dals ˇ ı ´ zdroje, se nacha ´ zı ´ na adrese www.perldoc.com
K problematice Perlu vysˇla rovne ˇ z ˇ r ˇada knih. Asi nejzna ´ meˇjs ˇ ı ´ je kniha Programming Perl od autoru ˚ Larry Walla, Toma Christiansena a Jona Orwanta (dnes existuje
∗ Podle knihy Programming Perl † Viz napr ˇ ı ´klad http://www.yapc.org/
jiz ˇ jejı ´ trˇetı ´ vyda ´nı´). Objevila poprve ´ ve verzi 4 a jedna ´ se v podstate ˇ o komentovanou verzi manua´lovy ´ ch stra´nek. Velbloud, zobrazeny ´ na titulnı ´ stra ´ nce knihy, se stal symbolem jazyka Perl (v anglicke ´ m jazyce se o te´to knize hovor ˇ ı ´ jako o „camel book“, cˇesky „velbloudı ´ kniha“).
Perl Golf
Jiz ˇ neˇkolik let probı´ha ´ na internetu zajı´mava ´ soute ˇ z ˇ s na ´ zvem perl golf Spoc ˇ ı ´va ´ v tom, z ˇ e soute ˇ z ˇ ı ´cı ´ majı ´ zapsat v Perlu dany ´ algoritmus tak, aby zabı´ral co nejme ´ ne ˇ znaku ˚
Vy ´ sledky jednotlivy ´ ch kol soute ˇ z ˇ e se sc ˇ ı ´tajı ´ a hra ´ cˇi tak majı ´ i svu ˚ j zˇebr ˇ ı ´cˇek.
Neˇktere ´ algoritmy jsou velmi proste ´ , jine ´ jsou poneˇkud obtı´z ˇ neˇjs ˇ ı ´. Mezi mnoho u ´ loh, ktere ´ zde byly r ˇ es ˇ eny, patr ˇ ı ´ napr ˇ ı ´klad vypsa ´ nı ´ urcˇity ´ ch znaku ˚ ASCII tabulky na r ˇ a´dky po 16 znacı´ch, algoritmy z ru ˚ zny ´ ch druhu ˚ her, kr ˇ ı ´zˇovky, kreslenı ´ ru ˚ zny ´ ch obrazcu ˚ , nalezenı ´ nejkrats ˇ ı ´ cesty v grafu, nacˇtenı ´ cˇi vypsa ´ nı ´ digita´lnı ´ c ˇ ı ´slice apod. Po kazˇde ´ m kole jsou vy ´ sledky vsˇech soute ˇ z ˇ ı ´cı´ch zverˇejne ˇ ny a mohou tak by ´ t dobrou inspiracı ´ nejen pro kola dals ˇ ı ´, ale je v nich moz ˇ ne ´ nale´zt i neˇktere ´ ze zajı´mavostı ´ Perlu. Pro zac ˇ ı ´najı´cı´, ale mnohdy i pokrocˇile ´ programa´tory, jsou vsˇak tato r ˇ es ˇ enı ´ nebo jejich c ˇ a´sti naprosto nesrozumitelne ´ . Je vsˇak velkou vy ´ zvou a i za´bavou, porovnat sve ´ znalosti s teˇmi nejleps ˇ ı ´mi, jako jsou Ton Hospel, MTV Europe, Rick Klement, Jasper McCrea, Daniel Tuijnman a dals ˇ ı ´.
Soutez ˇ pu ˚ vodne ˇ be ˇ zˇela na adrese perlgolf.sourceforge.net, ale tamnı ´ aktivity jiz ˇ prˇed dels ˇ ı ´ dobou utichly. Vesˇkere ´ de ˇ nı ´ se nynı ´ odehra ´ va ´ na stra´nka´ch Terje Kristensena, jejichz ˇ adresa je terje.perlgolf.org (soute ˇ zˇi se r ˇ ı ´ka ´ Minigolf). V poslednı ´ dobe ˇ se podobna ´ soute ˇ z ˇ odehra ´ va ´ i na polsky ´ ch atra´nka´ch www.kernelpanic.pl.
1.3 Instalace Perlu
Pokud ma ´ me na poc ˇ ı ´tacˇi operac ˇ nı ´ syste ´ m tr ˇ ı ´dy UNIX, je moz ˇ ne ´ , z ˇ e je Perl jeho standardnı ´ souc ˇ a´stı´. Pokud tomu tak nenı´, je trˇeba zdrojove ´ ko ´ dy nejprve sta´hnout (napr ˇ ze sı´te ˇ CPAN). Cely ´ Perl se nacha ´ zı ´ jako jeden archı´v, ktery ´ je nejprve trˇeba odpovı´dajı´cı´m zpu ˚ sobem rozbalit (za´lez ˇ ı ´ na metode ˇ , ktera ´ byla pro vytvor ˇ enı ´ archı´vu pouzˇita). Potom je dobre ´ pr ˇ ec ˇ ı ´st si soubory README a INSTALL, kde se nacha´zejı ´ instrukce, ktery ´ ch je trˇeba se drzˇet. Typicky spustı´me program Configure, ktery ´ zjistı ´ informace o syste ´ mu a vytva ´ r ˇ ı ´ soubor Config.pm, a da´le spustı´me program make Je vhodne ´ zkontrolovat instalaci pr ˇ ı ´kazem make test a nakonec spustit make install pro zkopı´rova ´ nı ´ souboru ˚ na spra ´ vne ´ mı´sto.
Pokud se rozhodneme nainstalovat Perl na operac ˇnı´m syste ´ mu Windows, mu ˚z ˇ eme sta´hnout instalac ˇ nı ´ archı´v ze stra´nek spolecˇnosti ActiveState. Ten se nacha ´ zı ´ bud’ ve forme ˇ instala´toru Windows (soubor s pr ˇ ı ´ponou .msi) nebo pouze ve forme ˇ umoz ˇ n ˇ ujı´cı ´ instalaci bez mozˇnosti odinstalova ´nı´. Prˇi instalaci se krome ˇ vlastnı´ho ko-
pı´rova ´ nı ´ Perlu provede asociace souboru ˚ s pr ˇ ı ´ponou .pl a take ´ nastavenı ´ neˇktery ´ ch prome ˇ nny ´ ch prostrˇedı´.
Ve vsˇech dostupny ´ ch operac ˇnı´ch syste´mech mu ˚ z ˇ eme Perl v podstate ˇ nainstalovat ze zdrojovy ´ ch ko ´ du ˚ , ∗ pouze se musı´me drzˇet instalac ˇnı´ch pokynu ˚ pro konkre´tnı ´ operac ˇ nı ´ syste ´ m (napr ˇ pro Windows se nacha´zejı ´ v souboru README.win32).
Pokud bychom chteˇli ze sı´te ˇ CPAN nainstalovat modul, je opeˇt trˇeba bra´t v u ´ vahu operac ˇ nı ´ syste ´ m, na ktere ´ m Perl be ˇ z ˇ ı ´. Instrukce, ktery ´ ch bychom se meˇli drzˇet, je moz ˇ ne ´ nale´zt na adrese http://www.cpan.org/modules/INSTALL.html. Mu ˚ z ˇ eme zmı´nit, z ˇ e jakmile jednou ma ´ me nainstalovany ´ standardnı ´ modul CPAN, mu ˚ z ˇ eme s jeho pomocı ´ instalovat moduly jednodus ˇ s ˇ ı ´m zpu ˚ sobem. Ve Windows si mu ˚ z ˇ eme vzı´t na pomoc program ppm (Programmer’s Package Manager, dr ˇ ı ´ve Perl Package Manager).
1.4 Typograficke ´ konvence te´to knihy
Pro odlis ˇ enı ´ textu ru ˚ zne´ho obsahu se v te´to knize pouz ˇ ı ´vajı ´ na´sledujı´cı ´ typograficke ´ konvence:
• Souvisla ´ c ˇ a´st zdrojove´ho ko ´ du programu je vysa ´ zena jako samostatny ´ odstavec neproporciona´lnı´m pı´smem
print ’Zadejte dve cı´sla:’;
my $x = <STDIN>; my $y = <STDIN>; print ’Soucet je ’, $x+$y;
• C ˇ a´sti ko ´ du programu, ktere ´ jsou souc ˇ a´stı ´ be ˇ z ˇ ne´ho textu, jsou rovne ˇ z ˇ vysa ´ zene ´ neproporciona´lnı´m pı´smem
Prome ˇ nne ´ , ktere ´ mohou obsahovat neˇkolik hodnot, se nazy ´ vajı ´ pole.
Jme ´ no takove ´ prome ˇ nne ´ zac ˇ ı ´na ´ znakem @ (napr ˇ . @hodnoty) a k jednotlivy ´ m hodnota ´ m se prˇistupuje prostrˇednictvı´m c ˇ ı ´selny ´ ch indexu ˚ Ty pı´s ˇ eme mezi dvojici hranaty ´ ch za ´vorek, prˇed jme ´ nem prome ˇ nne ´ pak pı´s ˇ eme znak $ (napr ˇ . $hodnoty[1]).
• Pokud se v textu objevı ´ neˇjake ´ du ˚ lezˇite ´ slovo cˇi pojem, bude na to upozorne ˇ no sklone ˇ ny ´ m pı ´ smem.
Velkou c ˇ a´st programu v Perlu tvor ˇ ı ´ vy ´ razy. Vy ´ raz je posloupnost operandu ˚ a opera´toru ˚ , a ma ´ po sve ´ m vyhodnocenı ´ vzˇdy urcˇitou hodnotu (pokud ne, tato hodnota se pr ˇ ı ´mo nazy ´ va ´ nedefinovana ´ hodnota).
• V textu se neˇkdy odvola ´ va ´ me na externı ´ pr ˇ ı ´kazy, syste ´ mova ´ vola ´ nı ´ cˇi soubory. Jejich jme ´ na jsou vysa ´ zena sklone ˇ ny ´ m bezpatkovy ´ m pı ´ smem.
∗ Dostupne ´ na adrese http://www.cpan.org/src/README.html.
Funkce uzavr ˇ e soubor /etc/passwd (k tomu je pouzˇito syste ´ move ´ vola ´ nı ´ endpwent). V pr ˇ ı ´pade ˇ u ´ speˇchu je vra ´ cena pravdiva ´ hodnota.
• Pokud se v textu odkazujeme na jinou kapitolu nebo na jejı ´ c ˇ a´st, je pouzˇito pı ´ smo sklone ˇ ne ´ .
Podrobne ˇ je pra ´ ce se seznamovy ´ mi prome ˇ nny ´ mi a seznamovy ´ mi hodnotami popsa ´ na v kapitole 4. Datove ´ typy, prome ˇ nne ´ , v c ˇ a´stech Pole a seznamy a Hashe (asociativnı´ pole)
• Adresy dokumentu ˚ na Internetu jsou vysa ´ zeny sˇirsˇı´m skloneny ´ m pı´smem. Seznam operac ˇnı´ch syste ´ mu ˚ , pro ktere ´ je Perl dostupny´, je moz ˇ ne ´ zı´skat na webove ´ adrese http://www.cpan.org/ports/index.html
STAVBA JAZYKA
• Charakter jazyka
• Struktura programu v Perlu
• Struc ˇ ny ´ prˇehled nejdu ˚ lezˇitejs ˇ ı ´ch prvku ˚ jazyka
V na´sledujı´cı ´ kapitole se sezna ´mı´me s prvky jazyka Perl, s jeho za´kladnı´mi konstrukcemi a zpu ˚ sobem za´pisu perlove´ho programu. Vsˇechno je samozrˇejme ˇ mnohem detailneˇji zmı´ne ˇ no v na´sledujı´cı´ch c ˇ a´stech knihy, u ´ cˇelem te´to kapitoly je pouze to, aby cˇtena ´ r ˇ zı´skal o jazyku alespon ˇ struc ˇ ny ´ prˇehled.
2.1 Charakter jazyka
Perl byl navrz ˇ en Larry Wallem, pr ˇ ı ´lezˇitostny ´ m lingvistou, proto ma ´ urcˇitou podobnost s prˇirozeny ´ m jazykem (anglicˇtinou). Za´pis programu v Perlu je proto veˇtsˇinou pome ˇ rne ˇ snadno cˇitelny ´ i pro obycˇejne´ho cˇloveˇka, ktery ´ se programova ´nı´m nezaby ´ va ´ Tak jako v prˇirozene ´ m jazyce existujı ´ slovnı ´ druhy (podstatna ´ jme ´ na, pr ˇ ı ´davna ´ jme ´ na, slovesa), stejne ˇ tak i v Perlu existujı ´ jejich „ekvivalenty“ podstatna ´ jme ´ na reprezentujı ´ prome ˇ nne ´ , pr ˇ ı ´davna ´ jme ´ na opera´tory vymezujı´cı ´ platnost prome ˇ nny ´ ch, slovesa tvor ˇ ı ´ vola ´ nı ´ podprogramu ˚ apod. Podobne ˇ , jako lze v prˇirozene ´ m jazyce jednu skutecˇnost vyja´drˇit neˇkolika zpu ˚ soby a jedno sdeˇlenı ´ mu ˚ z ˇ e mı´t ru ˚ zny ´ vy ´ znam v za ´vislosti na kontextu, v jake ´ m bylo proneseno, i v Perlu je tomu rovne ˇ z ˇ tak. Mu ˚ z ˇ eme r ˇ ı ´ci: „Jestliz ˇ e deˇlitel nenı ´ nula, proved’ podı´l.“ Mu ˚ z ˇ eme ale take ´ r ˇ ı ´ci: „Proved’ deˇlenı´, ale pouze v pr ˇ ı ´pade ˇ , z ˇ e je deˇlitel ru ˚ zny ´ od nuly.“ Vy ´ sledek je pokazˇde ´ stejny´, ale sdeˇlenı ´ bylo r ˇ ec ˇ eno pokazˇde ´ trochu jinak. Mu ˚ z ˇ eme take ´ r ˇ ı ´ci: „Nacˇti data ze vstupu,“ ale jednou na ´ s zajı´ma ´ jeden r ˇ a´dek, jindy chceme vs ˇ e. Neexistuje striktne ˇ dana ´ syntaxe, je moz ˇ ne ´ pouz ˇ ı ´vat ru ˚ zna ´ zjednodus ˇ enı ´ a zkracova ´ nı ´ za´pisu. Perl se vzˇdy snaz ˇ ı ´ porozumeˇt tomu, co jsme napsali.∗ Nic ale nebra ´ nı ´ tomu, abychom dodrzˇovali urcˇita ´ pravidla, ktera ´ ucˇinı ´ ko ´ d snadno cˇitelny ´ a podobny ´ jazyku ˚ m s pr ˇ esne ˇ danou strukturou a syntaxı´.
Podobne ˇ jako v prˇirozene ´ m jazyce je moz ˇ ne ´ v Perlu veˇci vyjadrˇovat pr ˇ ı ´mo, bez zbytec ˇ ny ´ ch pr ˇ ı ´vlastku ˚ , ktere ´ zamlzˇujı ´ pu ˚ vodnı ´ sdeˇlenı´. Podobne ˇ jako v prˇirozene ´ m jazyce lze veˇci vyja´drˇit velmi komplikovane ˇ tak, z ˇ e je te ´ me ˇ r ˇ nemoz ˇ ne ´ za´pis programu rozlusˇtit.
Existuje r ˇada mechanismu ˚ , ktere ´ se prova´deˇjı ´ implicitne ˇ cˇi jsou prˇedpokla´da ´ ny nebo ocˇeka ´ va ´ ny. Nenı ´ ale chybou, pokud tyto veˇci sdeˇlı´me Perlu explicitne ˇ . Je to spı´s ˇ e ota´zkou osobnı´ho vkusu a lenosti. Nenı ´ napr ˇ ı ´klad nutne ´ prova´deˇt deklarace prome ˇ nny ´ ch, nemusı´me nutne ˇ psa´t prˇi kazˇde ´ m vola ´ nı ´ podprogramu za´vorky okolo argumentu ˚ , v r ˇade ˇ mı´st se implicitne ˇ pouz ˇ ı ´vajı ´ prˇeddefinovane ´ prome ˇ nne ´ . V ne ˇktery ´ ch jiny ´ ch programovacı´ch jazycı´ch je naopak dodrz ˇ ova ´ nı ´ podobny ´ ch pravidel nezbytne ˇ nutne ´ pro syntaktickou spra´vnost programu (napr ˇ . jazyk Pascal, C). V Perlu nikoliv.
Perl mu ˚ z ˇ e by ´ t jazykem jednoduchy ´ m, snadny ´ m pro vyjadr ˇ ova ´nı´. Nenı ´ trˇeba zna´t mnoho, aby bylo moz ˇ ne ´ psa´t jednoduche ´ i me ´ ne ˇ slozˇite ´ programy Prˇi dals ˇ ı ´m postupne ´ m rozsˇir ˇ ova ´ nı ´ znalostı ´ je moz ˇ ne ´ pousˇteˇt se do programu ˚ slozˇity ´ ch, ktere ´
∗ Pro tuto vlastnost existuje zkratka DWIM „Do What I Mean“.
pracujı ´ s databa ´zı´, vyuz ˇ ı ´vajı ´ sı´t’ovou komunikaci cˇi komunikujı ´ s uzˇivatelem pomocı ´ graficke´ho uzˇivatelske´ho rozhranı´.
Klasicky ´ m pr ˇ ı ´kladem jednoduchosti a pr ˇ ı ´moc ˇarosti jazyka je na´sledujı´cı ´ uka´zka. Kdyz ˇ chcete napsat program, ktery ´ na obrazovku vytiskne pozdrav „Ahoj“, stac ˇ ı ´, aby cely ´ program obsahoval jeden r ˇ a´dek.∗
print ”Ahoj”;
U ´ plne ˇ stejny ´ m zpu ˚ sobem by se toto vyja´drˇilo v be ˇ z ˇ ne ´ m jazyce. Nenı ´ tedy trˇeba prova´deˇt ru ˚ zne ´ deklarace, r ˇ ı ´kat, kde zac ˇ ı ´na ´ a konc ˇ ı ´ teˇlo programu.
2.2 Prvky jazyka
Pro vytva ´ r ˇ enı ´ programu v Perlu nenı ´ trˇeba z ˇ a´dny ´ specia´lnı ´ prostrˇedek (jako napr ˇ vy ´ vojove ´ prostrˇedı ´ pro Turbo Pascal nebo C). Program v Perlu je obycˇejny ´ text obsahujı´cı ´ pı´smena, c ˇ ı ´slice, bı´le ´ znaky a neˇktere ´ specia´lnı ´ symboly Je moz ˇ ne ´ ho tedy vytva ´ r ˇet v libovolne ´ m textove ´ m editoru. V syste´mech UNIX tedy napr ˇ ı ´klad editorem vi, pico cˇi joe, ve Windows editorem Notepad (Pozna´mkovy ´ blok), WordPad cˇi TextPad Je du ˚ lezˇite ´ , aby se jednalo o cˇisty ´ text, ktery ´ neobsahuje z ˇ a´dne ´ r ˇ ı ´dı´cı ´ znaky pr ˇ ı ´slus ˇ ne´ho editoru.
Cely ´ text programu v Perlu se skla´da ´ z urcˇity ´ ch c ˇ a´stı´, ktere ´ jsou prˇekladac ˇ em urcˇity ´ m zpu ˚ sobem cha ´ pa ´ ny. V na´sledujı´cı ´ c ˇ a´sti kapitoly se s nimi postupne ˇ sezna ´mı´me. Prˇed tı´m ale zmı´nı´me dva uzˇitec ˇ ne ´ rezˇimy, v nichz ˇ mu ˚ z ˇ e interpret Perlu pracovat. Jednı´m z nich je rezˇim varova ´ nı ´ . V tomto rezˇimu, ktery ´ zapneme pr ˇepı´nac ˇ em -w, nastavenı´m hodnoty prome ˇ nne ´ $ˆW cˇi zavedenı´m pragmatu warnings, budeme upozorneˇni (vy ´ stupem na standardnı ´ chybovy ´ vy ´ stup) na podezrˇele ´ operace, jaky ´ mi jsou pouzˇitı ´ neˇktere´ho jme ´ na pouze jedenkra´t, tisk nedefinovane ´ hodnoty, lichy ´ pocˇet prvku ˚ prˇi prˇir ˇ azenı ´ do hashe, pra ´ ce s neotevr ˇ eny ´ m ovladac ˇ em apod.
Dals ˇ ı ´m rezˇimem je tzv striktnı´ rezˇim Ten zpu ˚ sobı ´ chybu v pr ˇ ı ´pade ˇ , z ˇ e se pokusı´me prova´deˇt neˇktere ´ nebezpec ˇ ne ´ operace pra ´ ce se jme ´ nem prome ˇ nne ´ , u ktere ´ nenı ´ zrˇejme ´ , jaky ´ je jejı ´ rozsah platnosti, pouzˇitı ´ holy ´ ch slov a pra ´ ce se symbolicky ´ mi odkazy Striktnı ´ rezˇim je zapnut zavedenı´m pragmaticke´ho modulu strict a vı´ce prostoru je mu ve ˇ nova ´ no v kapitole 19. Pragmaticke ´ moduly
Je dobre ´ oba tyto rezˇimy pouz ˇ ı ´vat, protoz ˇ e tak odhalı´me r ˇadu chyb jesˇte ˇ prˇed tı´m, nez ˇ program vu ˚ bec spustı´me.
∗ Toto je jeden ze zpu ˚ sobu za ´ pisu tohoto pr ˇ ı ´kazu. Text „Ahoj“ mu ˚ z ˇ e by ´ t uzavr ˇ eny ´ do uvozovek, apostrofu ˚ cˇi jako argument neˇjake´ho z r ˇete ˇ zcovy ´ ch opera ´ toru ˚ , mu ˚ z ˇ e a nemusı ´ by ´ t uzavr ˇ en do kulaty ´ ch za ´ vorek, na konci pr ˇ ı ´kazu v tomto pr ˇ ı ´pade ˇ mu ˚ z ˇ e a nemusı ´ by ´ t strˇednı´k. Proc ˇ tomu tak je a jaky ´ je rozdı´l mezi nastı´nenymi variantami se dozvı´me v dalsı´m textu.
Vy ´ razy a pr ˇ ı ´kazy
Velkou c ˇ a´st programu v Perlu tvor ˇ ı ´ vy ´ razy. Vy ´ raz je posloupnost operandu ˚ a opera ´toru ˚ , a ma ´ po sve ´ m vyhodnocenı ´ vzˇdy urcˇitou hodnotu (pokud ne, nazy ´ va ´ se tato hodnota pr ˇ ı ´mo nedefinovana ´ hodnota). Podle typu ˚ opera´toru ˚ jejich arity, priority a asociativity jsou s operandy prova´de ˇ ny ru ˚ zne ´ operace, ktere ´ ovlivn ˇ ujı ´ vy ´ sledek vy ´ razu. Operandy jsou obecne ˇ opeˇt vy ´ razy, pr ˇ ı ´pade ˇ jejich vy ´ sledne ´ hodnoty. Nejjednodus ˇ s ˇ ı ´m prvkem vy ´ razu je tzv. term, coz ˇ je napr ˇ . c ˇ ı ´slo, r ˇete ˇ zec cˇi vola ´ nı ´ podprogramu. Podrobne ˇ se termu ˚ m, opera´toru ˚ m a jejich vyhodnocova ´nı´m veˇnuje kapitola 6. Opera´tory. Je-li za vy ´ razem znak strˇednı´k, sta ´ va ´ se z neˇj pr ˇ ı ´kaz Protoz ˇ e kazˇdy ´ pr ˇ ı ´kaz je i vy ´ razem, ma ´ vzˇdy neˇjakou hodnotu bez ohledu na to, zda je tato hodnota potrˇebna ´ cˇi nikoliv
Program v Perlu je tedy posloupnost pr ˇ ı ´kazu ˚ vy ´ razu ˚ oddeˇleny ´ ch strˇednı´kem. Vyhodnocujı ´ se sekvenc ˇ ne ˇ , pr ˇ ı ´padne ˇ opakovane ˇ cˇi podmı´ne ˇ ne ˇ v za´vislosti na pouzˇity ´ ch pr ˇ ı ´kazech cyklu, veˇtvenı ´ cˇi skoku. Neˇktere ´ vy ´ razy majı ´ svu ˚ j vedlejs ˇ ı ´ efekt.
Jiz ˇ zmı´ne ˇ ny ´ pr ˇ ı ´klad print ”Ahoj” je vy ´ razem, jehoz ˇ hodnota je 1 ∗ Jedna ´ se o na ´vratovou hodnotu funkce print Vedlejs ˇ ı ´m efektem tohoto vy ´ razu je to, z ˇ e se na standardnı ´ vy ´ stup vytiskne slovo „Ahoj“.
Blok
Pr ˇ ı ´kazy mohou by ´ t spojeny do bloku. Blok je tedy posloupnost pr ˇ ı ´kazu ˚ uzavr ˇ eny ´ ch mezi dvojici sloz ˇ eny´ch za ´vorek. Poslednı ´ pr ˇ ı ´kaz v bloku nemusı ´ by ´ t ukonc ˇ en strˇednı´kem. C ˇ asto je to vsˇak doporuc ˇ ova ´ no, aby nedosˇlo k chybe ˇ nebo k neocˇeka ´ vany ´ m vy ´ sledku ˚ m v pr ˇ ı ´pade ˇ , z ˇ e bychom za tento poslednı ´ pr ˇ ı ´kaz chteˇli umı´stit neˇjaky ´ dals ˇ ı ´.
Je-li neˇkde ocˇeka ´ va ´ n blok, vzˇdy je tı´m rozume ˇ na posloupnost pr ˇ ı ´kazu ˚ uvnitr ˇ sloz ˇ eny ´ ch za ´vorek. Je tomu tak i v pr ˇ ı ´pade ˇ , z ˇ e by tento blok obsahoval pouze jeden jediny ´ pr ˇ ı ´kaz. Tato pozna´mka se ty ´ ka ´ napr ˇ ı ´klad pr ˇ ı ´kazu ˚ veˇtvenı ´ cˇi cyklu ˚ , kdy se v popisu syntaxe pr ˇ ı ´kazu nacha ´ zı ´ blok. Napr ˇ ı ´klad jazyk Pascal nebo C na tomto mı´ste ˇ vyzˇaduje pr ˇ ı ´kaz ten mu ˚ z ˇ e by ´ t bud’ jednoduchy´, nebo sloz ˇ eny ´ s ohranic ˇovacı´mi symboly begin a end nebo { a } Novı ´ programa´torˇi v Perlu zde cˇasto chybujı´.
Blok mu ˚ z ˇ e mı´t i sve ´ jme ´ no. Jme ´ no se mu mu ˚ z ˇ e prˇideˇlit prostrˇednictvı´m tzv. na ´ve ˇ sˇtı´. Na ´ ve ˇ s ˇtı´ je r ˇete ˇ zec na´sledovany ´ dvojtecˇkou. Pouz ˇ ı ´va ´ se pro r ˇ ı ´zenı ´ beˇhu programu pomocı ´ skoku ˚ cˇi funkcı ´ pro r ˇ ı ´zenı ´ beˇhu cyklu ˚ . Nenı ´ nutne ´ , aby na ´ ve ˇ sˇtı ´ pojmenova ´valo blok, mu ˚ z ˇ e se vyskytovat i jinde. Konvencı ´ je, z ˇ e se jeho jme ´ no pı´s ˇ e velky ´ mi pı´smeny, aby nedosˇlo k za ´ me ˇ ne ˇ s rezervovany ´ ch slovem. Vı´ce se bloku ˚ m a na ´ ve ˇ sˇtı´m veˇnuje kapitola 5. Pr ˇ ı ´kazy
Blok ma ´ i dals ˇ ı ´ vlastnosti, se ktery ´ mi se sezna ´mı´me v na´sledujı´cı´ch kapitola´ch koncem bloku napr ˇ ı ´klad konc ˇ ı ´ platnost balı´ku cˇi lexika´lne ˇ vymezeny ´ ch prome ˇ nny ´ ch.
∗ Za prˇedpokladu, z ˇ e se zadany ´ text u ´ spe ˇ s ˇ ne ˇ vytiskne do zvolene´ho vy ´ stupnı´ho souboru (implicitne ˇ na obrazovku).
Sloz ˇ ene ´ za´vorky neslouz ˇ ı ´ pouze pro ohranic ˇ enı ´ bloku, pouz ˇ ı ´vajı ´ se i pro zada ´ va ´ nı ´ hashovy ´ ch klı´c ˇ u ˚ , pro vytva ´ r ˇ enı ´ odkazu ˚ , neˇkdy i prˇi za´pisu jme ´ na prome ˇ nne ´ nebo jako ohranic ˇ ovacı ´ symbol argumentu ˚ neˇktery ´ ch opera´toru ˚ . To, zda se jedna ´ o blok nebo jiny ´ zpu ˚ sob uzˇitı ´ sloz ˇ eny ´ ch za ´vorek, se pozna ´ podle kontextu, kde jsou pr ˇ ı ´slus ˇ ne ´ symboly pouzˇity. Neˇkdy je trˇeba kompila´toru „pomoci“, napr ˇ ı ´klad pouzˇitı´m una ´rnı´ho + cˇi zme ˇ nou porˇadı ´ jednotlivy ´ ch c ˇ a´stı ´ vy ´ razu, kde jsou sloz ˇ ene ´ za´vorky pouzˇity. Pr ˇ ı ´klady budou uvedeny da´le v kapitole 6. Opera´tory.
Opera´tory
Opera´tory v Perlu mu ˚ z ˇ eme cha´pat jako zvla ´ sˇtnı ´ podprogramy, ktere ´ pracujı ´ se svy ´ mi operandy a vracejı ´ urcˇitou hodnotu. Rozdı´l mezi podprogramy a opera´tory je ve zpu ˚ sobu za´pisu (podprogramy se zapisujı ´ pouze v tzv. prefixove ´ m tvaru, kdy jme ´ no podprogramu prˇedcha ´ zı ´ svy ´ m argumentu ˚ m, opera´tory se zapisujı ´ v prefixove ´ m, postfixove ´ m (opera´tor se nacha ´ zı ´ za operandem) i infixove ´ m tvaru (opera´tor je mezi operandy)). Kazˇdy ´ opera´tor ma ´ dany ´ pocˇet operandu ˚ , se ktery ´ mi pracuje (tato vlastnost se nazy ´ va ´ arita), a ktere ´ jsou prova´de ˇ ne ´ v urcˇite ´ m porˇadı ´ (podle jejich priority).
Opera´toru ˚ existuje pome ˇ rne ˇ velke ´ mnozˇstvı ´ a tabulka urcˇujı´cı ´ jejich prioritu je pome ˇ rne ˇ obsa´hla ´ a slozˇita ´ na zapamatova ´nı´. Dobrou zpra ´ vou je, z ˇ e veˇtsˇina opera´toru ˚ Perlu ma ´ svoje ekvivalenty i v jiny ´ ch programovacı´ch jazycı´ch cˇi programovy ´ ch prostrˇedcı´ch. Detailne ˇ se opera´toru ˚ m veˇnuje kapitola 6. Opera´tory.
Pr ˇ ı ´kazy
Jednoduchy ´ pr ˇ ı ´kaz je vy ´ raz ukonc ˇ eny ´ strˇednı´kem. Kazˇdy ´ takovy ´ pr ˇ ı ´kaz mu ˚ z ˇ e navı´c obsahovat modifika´tor, ktery ´ upr ˇ esn ˇ uje kolikra´t a zda vu ˚ bec ma ´ by ´ t pr ˇ ı ´kaz proveden.
# jednoduchy ´ prˇı´kaz bez modifika´toru print ”$x / $y = ”, $x/$y;
# jednoduchy ´ prˇı´kaz s modifika´torem, provede se pouze # v prˇı´padeˇ, z ˇe hodnota promeˇnne ´ $y je ru ˚ zna ´ od 0 print ”$x / $y = ”, $x/$y if $y != 0;
# vytiskne druhe ´ mocniny c ˇ ı ´sel od 1 do 10 $x = 0; print ”$x * $x = ”, $x*$x, ”\n” while ++$x <= 10;
Jednotlive ´ pr ˇ ı ´kazy programu nemusejı ´ by ´ t samozrˇejme ˇ prova´de ˇ ny pouze sekvenc ˇ ne ˇ , ale take ´ opakovane ˇ cˇi vu ˚ bec prˇi nesplne ˇ nı ´ urcˇite ´ podmı´nky. Aby to bylo umoz ˇ ne ˇ no, Perl nabı´zı ´ tzv. r ˇ ı ´dicı ´ pr ˇ ı ´kazy.
Jako veˇtsˇina programovacı´ch jazyku ˚ ma ´ Perl implementova ´ no veˇtvenı ´ pomocı ´ pr ˇ ı ´kazu if nebo unless, cyklus s podmı´nkou na zac ˇ a´tku while a for urc ˇ eny ´
prima ´ rne ˇ pro prˇedem zna ´ my ´ pocˇet opakova ´nı´. Existuje navı´c cyklus foreach, ktery ´ umoz ˇ n ˇ uje prova´deˇt jednotlive ´ iterace pro kazˇdou polozˇku ze zadane´ho seznamu. Pro cyklus s podmı´nkou na konci neexistuje z ˇ a´dny ´ specia´lnı ´ pr ˇ ı ´kaz, ale je moz ˇ ne ´ ho vytvorˇit s vyuzˇitı´m ostatnı´ch konstrukcı´. Pr ˇ ı ´kazy a jejich syntaxe jsou na´plnı ´ kapitoly 5. Pr ˇ ı ´kazy.
if ($x == 0) { print ”$x / $y = ”, $x/$y; } else { print ”Nelze deˇlit nulou.”; }
$x = 1; while ($x <= 10) { print ”$x * $x = ”, $x*$x, ”\n”; $x++; } Prˇi rozhodova ´ nı ´ o tom, zda se urcˇita ´ c ˇ a´st ko ´ du provede nebo neprovede, je trˇeba v logicke ´ m kontextu vyhodnotit vy ´ raz zvany ´ podmı´nka rozhodnutı ´ se prova´dı ´ na za´klade ˇ jejı ´ pravdivosti cˇi nepravdivosti. Pravdive ´ jsou v Perlu vsˇechny vy ´ razy, krome ˇ nedefinovane ´ hodnoty, hodnoty 0, pra´zdne´ho r ˇete ˇ zce a r ˇete ˇ zce obsahujı´cı´ho pouze znak 0. Podrobne ˇ je pravdivost rozebra ´ na v kapitole 3. Kontext.
Bı´le ´ znaky
Du ˚ lezˇitou souc ˇ a´stı ´ programu v Perlu jsou i bı´le ´ znaky. Jedna ´ se o znaky jako mezera, tabula´tor, znak nove´ho r ˇ a´dku. Tyto znaky jsou prˇi interpretaci ignorova ´ ny, takz ˇ e neza´lez ˇ ı ´ na tom, zda je neˇkde uveden jeden znak nove´ho r ˇ a´dku nebo je jich sto (vy ´ jimkou je pouzˇitı ´ teˇchto znaku ˚ napr ˇ . v r ˇete ˇ zcove ´ m litera´lu). Slouz ˇ ı ´ k oddeˇlenı ´ symbolu ˚ , ktere ´ by jinak mohly by ´ t cha ´ pa ´ ny jako celek Perl se totiz ˇ vzˇdy snaz ˇ ı ´ nale´zt co nejveˇts ˇ ı ´ c ˇ a´st ko ´ du, ktera ´ by mohla tvorˇit jeden nedeˇlitelny ´ celek. Objevı´-li se napr ˇ ı ´klad v programu r ˇete ˇ zec $promenna, Perl to vzˇdy bude povazˇovat za jme ´ no prome ˇ nne ´ , ktera ´ se jmenuje $promenna. I kdyz ˇ by spra ´ vny ´ na ´ zev byl i $p, $pr atd.
Bı´le ´ znaky mohou take ´ vy ´ razne ˇ zvysˇovat cˇitelnost programu. Program v Perlu mu ˚ z ˇ e by ´ t klidne ˇ napsa ´ n na jednom r ˇ a´dku pouze s tolika bı´ly ´ mi znaky, kolik je nezbytne ˇ nutne ´ Vhodne ´ odr ˇ a´dkova ´ nı ´ a odsazova ´ nı ´ vsˇak mu ˚ z ˇ e podstatny ´ m zpu ˚ sobem program zprˇehlednit a zjednodusˇit tak pr ˇ ı ´padne ´ u ´ pravy
Komenta ´ r ˇ e
Dals ˇ ı ´ souc ˇ a´stı ´ programu jsou komenta ´ r ˇ e Nejsou nezbytne ´ , ale jejich pouzˇitı ´ je nanejvy ´ s ˇ vhodne ´ Nejsou pr ˇ ı ´mou souc ˇ a´stı ´ programu, prˇi interpretaci se stejne ˇ jako bı´le ´ znaky
ignorujı´. Zvysˇujı ´ prˇehlednost programove´ho ko ´ du a vysveˇtlujı ´ vy ´ znam pouzˇity ´ ch konstrukcı´. Zac ˇ ı ´najı ´ znakem # a pokracˇujı ´ az ˇ do konce r ˇ a´dku.
Zvla ´ sˇtnı´m druhem komenta ´ r ˇ e je tzv shebang ∗ Objevuje se na prvnı´m r ˇ a´dku
skriptu a zac ˇ ı ´na ´ symboly #! na´sledovany ´ mi jme ´ nem souboru reprezentujı´cı´ho interpret Perlu (mezi #! a jme ´ nem souboru mohou nebo nemusejı ´ by ´ t mezery). Ma ´ vy ´ znam u skriptu ˚ na operac ˇnı´ch syste´mech UNIX. R ˇ ı ´ka ´ shellu, ktery ´ program se ma ´ pro vykona ´ nı ´ skriptu spustit v pr ˇ ı ´pade ˇ , z ˇ e je soubor spusˇte ˇ n jako spustitelny ´ soubor. Shebang mu ˚ z ˇ e mı´t na´sledujı´cı ´ podobu:
#! /usr/bin/perl -w
Tı´m je r ˇ ec ˇ eno, z ˇ e soubor ma ´ by ´ t prˇeda ´ n programu perl v adresa ´ r ˇi /usr/bin. Ma ´ by ´ t rovne ˇ z ˇ spusˇte ˇ n s pr ˇepı´nac ˇ em -w (znamena ´ to vypisova ´ nı ´ varovny ´ ch hla ´ s ˇenı´). Tento r ˇete ˇ zec samozrˇejme ˇ za´lez ˇ ı ´ na skutec ˇ ne ´ m umı´ste ˇ nı ´ interpretu a na tom, jake ´ pr ˇepı´nac ˇ e Perlu chceme pouz ˇ ı ´t.
V syste´mech Windows shebang nenı ´ trˇeba pouz ˇ ı ´vat, protoz ˇ e interpret Perlu je moz ˇ ne ´ asociovat k souboru ˚ m reprezentujı´cı´m perlove ´ skripty (na za´klade ˇ jejich pr ˇ ı ´pony†). Prˇi otevr ˇ enı ´ takove´ho souboru se pak automaticky zavola ´ interpret, jemuz ˇ se obsah souboru prˇeda ´ .
Vı´cer ˇ a´dkove ´ komenta ´ r ˇ e
Vı´cer ˇ a´dkove ´ komenta ´ r ˇ e zac ˇ ı ´najı ´ r ˇ a´dkem, jehoz ˇ prvnı ´ znak = je na´sledova ´ n alespon ˇ jednı´m pı´smenem a da´le jaky ´ mikoliv znaky, a konc ˇ ı ´cı ´ r ˇ a´dkem zac ˇ ı ´najı´cı´m na =cut Oba tyto r ˇ a´dky a vesˇkery ´ text mezi nimi je interpretem ignorova ´ n.
print ’ahoj’; # toto je komenta´r ˇ - prˇı´kaz vytiskne ’ahoj’
=komentar
Toto je
vı´cerˇa´dkovy ´ komenta´r ˇ =cut
Tento typ komenta ´ r ˇ u ˚ je vyuzˇit i v ra´mci dokumentace zvane ´ Plain Old Documentation. Pouz ˇ ı ´va ´ se nejcˇasteˇji k dokumentaci modulu ˚ a jejı ´ podrobneˇjs ˇ ı ´ popis se nacha ´ zı ´ v kapitole 14. Moduly
∗ Nazev shebang vznikl z vyslovnosti nazvu ˚ obou techto symbolu ˚ znak # se nekdy nazyva sharp a znak ! bang. †Prˇi instalaci ActiveState Perlu pro Windows je nabı´zena pr ˇ ı ´pona .pl, ale neˇkter ˇ ı ´ autorˇi doporucˇujı ´ zvolit pr ˇ ı ´ponu .plx, protoz ˇ e pr ˇ ı ´pona .pl je urc ˇ ena pro knihovny (Perl Library).
Litera´love ´ symboly
Identifika´tory zac ˇ ı ´najı´cı ´ a konc ˇ ı ´cı ´ dve ˇ ma podtrz ˇ ı ´tky jsou v Perlu pouzˇity pro zvla ´ sˇtnı ´ u ´ cˇely. Litera´lovy ´ symbol __FILE__ obsahuje jme ´ no aktua´lne ˇ prova´de ˇ ne´ho souboru, __LINE__ c ˇ ı ´slo aktua´lne ˇ prova´de ˇ ne ´ r ˇ a´dky a __PACKAGE__ balı´k pouz ˇ ı ´vany ´ v okamzˇiku zjisˇt’ova ´ nı ´ hodnoty tohoto symbolu. Litera´l __END__ logicky ukoncˇuje skript jesˇte ˇ prˇed koncem souboru. Na´sledujı´cı ´ obsah je ignorova ´ n, ale je pr ˇ ı ´stupny ´ pomocı ´ ovladac ˇ e DATA. Podobnou funkci ma ´ symbol __DATA__, ktery ´ otevı´ra ´ ovladac ˇ
DATA ve jmenne ´ m prostoru aktua´lne ˇ pouz ˇ ı ´vane´ho balı´ku. Prˇi pouzˇitı ´ teˇchto symbolu ˚ uvnitr ˇ r ˇete ˇ zce v uvozovka´ch nedojde ke vloz ˇ enı ´ jejich hodnot.
Identifika´tory
Identifika´tory slouz ˇ ı ´ k pojmenova ´ nı ´ jednotlivy ´ ch objektu ˚ programu, c ˇ ı ´mz ˇ docha ´ zı ´ k jejich odlis ˇ enı ´ od ostatnı´ch. Du ˚ lezˇitou vlastnostı ´ jazyka je, z ˇ e rozlisˇuje mezi maly ´ mi a velky ´ mi pı´smeny (r ˇ ı ´ka ´ me, z ˇ e Perl je case-sensitive). Deˇje se tak nejen v r ˇete ˇzcı´ch cˇi r ˇete ˇ zcovy ´ ch litera´lech, ale i u identifika´toru ˚ (tzn. u jmen prome ˇ nny ´ ch, podprogramu ˚ , modulu ˚ apod.). Pokud tedy neˇkde v programu pouzˇijeme prome ˇ nnou $Slovo a o kousek da´le chceme pouz ˇ ı ´t tu stejnou prome ˇ nnou, ale napı´s ˇ eme $slovo, mu ˚ z ˇ eme dostat pro na ´ s neocˇeka ´ vane ´ vy ´ sledky. Perl totiz ˇ z ˇ a´dnou chybu nezahla ´sı´,∗ ale bude pracovat s novou prome ˇ nnou, ktera ´ ma ´ jinou hodnotu, nez ˇ bychom potrˇebovali. Je to proto, z ˇ e deklarace prome ˇ nny ´ ch se neprova´dı ´ prome ˇ nne ´ vznikajı ´ az ˇ v mı´ste ˇ sve´ho prvnı´ho pouzˇitı´.
Abychom se vyhnuli takovy ´ m proble ´ mu ˚ m, dodrzˇujı ´ se urcˇite ´ konvence. Jme ´ na prome ˇ nny ´ ch se pı´s ˇ ı ´ maly ´ mi pı´smeny, jme ´ na modulu ˚ s prvnı´m pı´smenem velky ´ m, ovladac ˇ e velky ´ mi pı´smeny. Jme ´ na, ktera ´ jsou pr ˇ esne ˇ dana ´ a jsou ocˇeka ´ va ´ na mechanismy Perlu nebo neˇktery ´ mi moduly a jsou cˇasto vyuz ˇ ı ´va ´ na implicitne ˇ , se veˇtsˇinou pı´s ˇ ı ´ velky ´ mi pı´smeny (AUTOLOAD, BEGIN, @EXPORT apod.). Nenı ´ to nutnost, ale mu ˚ z ˇ e to odstranit r ˇadu proble ´ mu ˚ a zvy ´ sˇit cˇitelnost programu.
Identifika´tory zac ˇ ı ´najı´cı ´ pı´smenem nebo podtrz ˇ ı ´tkem mohou mı´t libovolnou de´lku (minima´lne ˇ je zaruc ˇ eno 255 znaku ˚ ) a mohou obsahovat pı´smena, c ˇ ı ´slice a podtrz ˇ ı ´tka. Identifika´tory zac ˇ ı ´najı´cı ´ c ˇ ı ´slicı ´ mohou obsahovat pouze dals ˇ ı ´ c ˇ ı ´slice. Jestliz ˇ e jme ´ no prome ˇ nne ´ zac ˇ ı ´na ´ jiny ´ m znakem, omezuje se cˇasto pouze na tento jediny ´ znak. Tyto prome ˇ nne ´ majı ´ v Perlu veˇtsˇinou urcˇity ´ specia´lnı ´ vy ´ znam (napr ˇ $$ identifika´tor procesu, $” oddeˇlovac ˇ seznamovy ´ ch hodnot prˇi vkla´da ´ nı ´ do r ˇete ˇ zcu ˚ ) a jsou jako jedine ´ povaz ˇ ova ´ ny za globa´lnı ´ (nenı ´ nutna ´ plna ´ specifikace jejich jme´na). Protoz ˇ e tato jme ´ na jsou sˇpatne ˇ zapamatovatelna ´ , byl vytvor ˇ en modul English, jehoz ˇ zavedenı ´ umoz ˇ n ˇ uje pojmenova´vat tyto prome ˇ nne ´ alternativnı´mi jme ´ ny (mı´sto $$ pouzˇijeme $PID apod.).
Jme ´ no mu ˚ z ˇ e obsahovat i symbol :: Tı´mto symbolem se oddeˇlujı ´ jme ´ na balı´ku ˚ a jme ´ no balı´ku od jme ´ na prome ˇ nne ´ cˇi podprogramu. Konstrukce $Kniha::nazev oznacˇuje prome ˇ nnou $nazev z balı´ku Kniha
∗ Pokud zapneme vy ´ pis varovny ´ ch hla ´ s ˇenı´, je moz ˇ ne ´ , z ˇ e tuto chybu odhalı´me. Pokud pouzˇijeme striktnı ´ rezim pomocı ´ use strict, je vetsı ´ pravdepodobnost, ze tuto chybu odhalı´me jiz v dobe prekladu.
# platne identifika´tory
$x;
%_abc; @12345; $dlouhe_jmeno_promenne; $Balik::jmeno;
# neplatny ´ identifika´tor
$#ˆ%;
Zvla ´ sˇtnı´m pr ˇ ı ´padem je pra ´ ce se jme ´ nem jako s klı´c ˇ em tabulky symbolu ˚ , kdy jme ´ no mu ˚ z ˇ e by ´ t tvor ˇ eno libovolny ´ mi znaky (tento pr ˇ ı ´klad je uka ´ za ´ n v kapitole 13. Balı´ky).
Prome ˇ nne ´ , ovladac ˇ e, forma´ty, typegloby, podprogramy
Prome ˇ nne ´ jsou nositelem ru ˚ zny ´ ch vlastnostı ´ (hodnot) a tvor ˇ ı ´ datovou podstatu programu. Pomocı ´ jme ´ na prome ˇ nne ´ se odkazujeme do operac ˇ nı ´ pameˇti, kde jsou uloz ˇ ena urcˇita ´ data. Prome ˇ nne ´ mohou obsahovat jednoduchou skala ´ rnı ´ hodnotu (nazy ´ vajı ´ se skala´ry), nebo hodnoty na´sobne ´ seznamove ´ (pole a asociativnı ´ pole neboli hash).
Skala ´ rnı ´ prome ˇ nna ´ mu ˚ z ˇ e obsahovat bud’ c ˇ ı ´slo nebo r ˇete ˇ zec (jesˇte ˇ mu ˚ z ˇ e obsahovat odkaz, ale to je trochu jina ´ kategorie). Nenı ´ vsˇak moz ˇ ne ´ r ˇ ı ´ci, z ˇ e neˇjaka ´ konkre´tnı ´ prome ˇ nna ´ obsahuje c ˇ ı ´slo a jina ´ r ˇete ˇ zec. Obsah bude cha ´ pa ´ n podle toho, kde bude prome ˇ nna ´ pouzˇita. Bude-li pouzˇita opera´torem pro sc ˇ ı ´ta ´ nı ´ pracujı´cı´m s c ˇ ı ´sly, bude s hodnotou prome ˇ nne ´ pracova ´ no jako s c ˇ ı ´slem, pokud pouzˇijeme prome ˇ nou ve vy ´razu s r ˇete ˇ zcovy ´ m opera´torem, bude cha ´ pa ´ na jako r ˇete ˇ zec. Prome ˇ nnou mu ˚ z ˇ eme pouz ˇ ı ´t take ´ v logicke ´ m vy ´ razu, potom na jejı ´ hodnotu pode pohlı´z ˇ eno jako na logickou hodnotu. I kdyz ˇ bude obsah prome ˇ nne ´ ve vsˇech trˇech pr ˇ ı ´padech stejny´, nebude to chyba, provedou se totiz ˇ automaticke ´ konverze.
Ovladacˇe jsou objekty, ktere ´ na ´ m umoz ˇ n ˇ ujı ´ pracovat se soubory, adresa ´ r ˇi, rourami cˇi sockety Ovladac ˇ nejcˇasteˇji spojujeme se souborem a pouz ˇ ı ´va ´ me k tomu funkci open. open SOUBOR, ’data.txt’; # otevrˇe soubor data.txt pro c ˇtenı´, # pro prˇı´stup k souboru bude pouzˇit # ovladac SOUBOR
Pomocı ´ forma´tu ˚ je moz ˇ ne ´ definovat vzhled vy ´ stupu z programu. Forma´t je jaka´si sˇablona prˇidruz ˇ ena ´ k ovladacˇi, pomocı ´ ktere ´ se vesˇkery ´ vy ´ stup upravuje (pro za´pis pouz ˇ ı ´va ´ me funkci write).
Zvla ´ sˇtnı´m u ´ tvarem jsou typegloby, jez ˇ pojmenova´vajı ´ vsˇechno, co se jmenuje stejne ˇ jako typeglob. Prostrˇednictvı´m typeglobu mu ˚ z ˇ eme prˇistupovat ke skala ´ ru ˚ m, polı´m, hashu ˚ m, ovladac ˇ u ˚ m, forma´tu ˚ m a podprogramu ˚ m.
Podprogramy at’uz ˇ vestave ˇ ne ´ , nebo uzˇivatelem definovane ´ vykona´vajı ´ urcˇite ´ akce a cˇasto pracujı ´ s prome ˇ nny ´ mi. Tvor ˇ ı ´ podstatu programu z hlediska prova´de ˇny ´ ch cˇinnostı´. V terminologii jiny ´ ch programovacı´ch jazyku ˚ by ´ vajı ´ podprogramy bez na´vratove ´ hodnoty oznac ˇ eny jako procedury, podprogramy s na´vratovou hodnotou jako funkce. V Perlu nenı ´ z ˇ a´dny ´ rozdı´l mezi procedurami a funkcemi, nebot’v Perlu ma ´ vsˇechno neˇjakou hodnotu. Procedury v prave ´ m slova smyslu tedy neexistujı´, vsˇechny podprogramy jsou nazy ´ va ´ ny funkcemi.∗ Za´lez ˇ ı ´ pouze na programa´torovi, zda na´vratovou hodnotu podprogramu vyuzˇije cˇi nikoliv.
Kazˇda ´ prome ˇ nna ´ i funkce majı ´ sve ´ pojmenova ´nı´. Pravidla pro vytva ´ r ˇ enı ´ jmen jsou zmı´ne ˇ na vy ´ s ˇ e. Perl ma ´ tu vlastnost, z ˇ e je moz ˇ ne ´ zvolit stejne ´ jme ´ no pro skala ´ rnı ´ prome ˇ nnou, prome ˇ nnou typu pole, podprogram atd. Aby se jednotlive ´ druhy objektu ˚ od sebe odlisˇily, prˇed jejich jme ´ no pı´s ˇ eme jesˇte ˇ jeden znak specifikujı´cı ´ typ objektu.
Jme ´ no skala ´ rnı ´ prome ˇ nne ´ zac ˇ ı ´na ´ znakem $ ($ je podobne ´ pı´smenu S jako Skala´r), jme ´ no pole znakem @ (@ znamena ´ A jako Array), hash % (% prˇipomı´na ´ pı´smeno H jako Hash), jme ´ nu typeglobu prˇedcha ´ zı ´ znak * (* je cˇasto za´stupny ´ m symbolem pro jaky ´ koliv znak) a prˇed jme ´ ny funkcı ´ se pı´s ˇ e & Ovladac ˇ e ani forma´ty z ˇ a´dny ´ prefix nemajı´.
Typicky ´ m znakem Perlu je to, z ˇ e prome ˇ nne ´ cˇi ovladac ˇ e se nemusejı ´ nikde deklarovat ani inicializovat, vznikajı ´ az ˇ v okamzˇiku potrˇeby prˇi jejich prvnı´m pouzˇitı´. Neznamena ´ to, z ˇ e to v z ˇ a´dne ´ m pr ˇ ı ´pade ˇ nesmı´te udeˇlat. Je to ale spı´s ˇ e zvyk z jiny ´ ch programovacı´ch jazyku ˚ a brzy urcˇite ˇ prˇejde.
Podrobne ˇ je pra ´ ce se skala ´rnı´mi a seznamovy ´ mi prome ˇ nny ´ mi a skala ´rnı´mi a seznamovy ´ mi hodnotami popsa ´ na v kapitole 4. Datove ´ typy, prome ˇ nne ´ , pra ´ ce s podprogramy v kapitole 9. Podprogramy a forma´ty se zaby ´ va ´ kapitola 8. Forma´ty. Ovladac ˇ e jsou zmı´ne ˇ ny v kapitole 17. Pra ´ ce se soubory a adresa ´ r ˇi a u popisu funkce open v kapitole 10. Standardnı´ funkce. Typegloby jsou detailneˇji rozebra ´ ny v kapitole 13. Balı´ky.
Balı´ky, tabulky symbolu ˚ , moduly
Jme ´ na prome ˇ nny ´ ch, podprogramu ˚ , ovladac ˇ u ˚ apod. patr ˇ ı ´ do urcˇite´ho prostoru jejich platnost je omezena ´ , nejsou viditelne ´ vsˇude (vy ´ jimku tvor ˇ ı ´ neˇkolik specia´lnı´ch prome ˇ nny ´ ch a ovladac ˇ u ˚ , jejich seznam a vy ´ znam se nacha ´ zı ´ v kapitole 4. Datove ´ typy, prome ˇ nne ´). R ˇ ı ´ka ´ me, z ˇ e jejich rozsah platnosti je vymezeny ´ na urcˇity ´ jmenny ´ prostor
Takovy ´ jmenny ´ prostor se nazy ´ va ´ balı´k. Kazˇdy ´ balı´k ma ´ svoji tabulku symbolu ˚ , kde jsou uchova ´ va ´ na jme ´ na vsˇech objektu ˚ a odkazy na jejich hodnoty. Implicitne ˇ pouz ˇ ı ´vany ´ m balı´kem (pokud nerˇekneme jinak) je balı´k main (tam se za ´ roven ˇ nacha´zejı ´ ony zmı´ne ˇ ne ´ specia´lnı ´ prome ˇ nne ´ , ktere ´ jsou vzˇdy globa´lnı´). Ten za ´ roven ˇ obsahuje odkazy na vsˇechny ostatnı ´ tabulky symbolu ˚ , takz ˇ e jaky ´ koliv objekt nacha´zejı´cı ´ se v tabulce symbolu ˚ je v podstate ˇ globa´lnı ´ (je moz ˇ ne ´ se k ne ˇ mu vzˇdy dostat pr ˇ es tabulku symbolu ˚ balı´ku main).
∗ Protoz ˇ e existuje podobnost mezi funkcemi a opera ´ tory, prˇedevs ˇ ı ´m seznamovy ´ mi, by ´ va ´ take ´ neˇkdy zame ˇ n ˇ ova ´ n pojem funkce a opera ´ tor
Platnost balı´ku vyznacˇujeme pomocı ´ funkce package, ktere ´ jako argument pr ˇ eda ´ me jme ´ no balı´ku, ktery ´ ma ´ by ´ t aktivnı´.
Jme ´ no kazˇde´ho objektu se navı´c krome ˇ sve´ho jme ´ na skla´da ´ i ze jme ´ na balı´ku, do ktere´ho patr ˇ ı ´. Obe ˇ tyto c ˇ a´sti jsou od sebe oddeˇleny znakem :: Pokud jme ´ no balı´ku neuvedeme, prˇedpokla´da ´ se, z ˇ e objekt na´lez ˇ ı ´ do balı´ku aktua´lnı´ho.
package A; $x = ’123’; # nastavenı ´ promeˇnne ´ $x v balı´ku A
package B; print $x; # tisk promeˇnne ´ $x z balı´ku B, nevytiskne # nic, protozˇe promeˇnna ´ ma ´ nedefinovanou hodnotu print $A::x; # vytiskne ’123’
U prome ˇ nny ´ ch ma ´ me navı´c mozˇnost specifikovat jejich rozsah platnosti. Existujı ´ trˇi zpu ˚ soby dynamicke ´ vymezenı ´ platnosti hodnoty prome ˇ nne ´ pomocı ´ opera´toru local, lexika´lnı´ vymezenı ´ jme´na globa´lnı´ prome ˇ nne ´ opera´torem our a lexika´lnı´ vymezenı ´ prome ˇ nne ´ za pomoci opera´toru my
Poslednı ´ jmenovany ´ zpu ˚ sob umist’uje prome ˇ nnou mı´sto do tabulky symbolu ˚ do specia´lnı´ho prostoru, takz ˇ e se pak jedna ´ o skutec ˇ ne ˇ loka´lnı ´ prome ˇ nnou. Po opusˇte ˇ nı ´ rozsahu platnosti je zrus ˇ ena, takz ˇ e da´l nezabı´ra ´ pameˇt’. V pr ˇ ı ´kladech te´to knihy bude tento zpu ˚ sob obc ˇ as pouzˇit, protoz ˇ e se jedna ´ o dobry ´ zvyk (takove´to loka´lnı ´ prome ˇ nne ´ nenarusˇujı ´ sve ´ okolı ´ a pra ´ ce s nimi je rychlejs ˇ ı ´). Dynamicke ´ vymezenı ´ platnosti pouze pro dany ´ rozsah platnosti zastı´nı ´ hodnotu prome ˇ nne ´ a po opusˇte ˇ nı ´ rozsahu platnosti je tato hodnota obnovena zpeˇt. Lexika´lnı ´ vymezenı ´ jme ´ na globa´lnı ´ prome ˇ nne ´ zpu ˚ sobı ´ vytvor ˇ enı ´ aliasu pro jme ´ no globa´lnı ´ prome ˇ nne ´ , a ta se pak chova ´ jako loka´lnı ´ prome ˇ nna ´ .
Rozsah platnosti v tomto pr ˇ ı ´pade ˇ nenı ´ omezen balı´kem, ale blokem, kde byla pr ˇ ı ´slus ˇ na ´ deklarace provedena.
Krome ˇ zpu ˚ sobu uschova ´ nı ´ prome ˇ nne ´ v pameˇti (tabulka symbolu ˚ nebo lexika´lnı ´ prostor) ovlivn ˇ uje platnost prome ˇ nne ´ take ´ proces vyhleda ´ nı ´ prome ˇ nne ´ podle jme ´ na.
Alespon ˇ nastı´nit problematiku vymezova ´ nı ´ platnosti prome ˇ nny ´ ch ma ´ za u ´ kol na´sledujı´cı ´ pr ˇ ı ´klad.
$globalni = ’globalni’; { print $globalni; # vytiskne ’globalni’
$lokalni = 123; my $globalni = 123; my $lexikalni = ’lexikalni’ { local $lokalni = ’lokalni’; print $globalni; # vytiskne ’123’
our $globalni; print $globalni; # vytiskne ’globalni’ }
print $globalni; # vytiskne ’123’ print $lokalni; # vytiskne ’123’ }
print $lexikalni; # nevytiskne nic
Balı´ky, tabulky symbolu ˚ a rozsahy platnosti prome ˇ nny ´ ch jsou na´plnı ´ kapitoly 13. Balı´ky.
Pokud umı´stı´me balı´k do souboru, ktery ´ se jmenuje stejne ˇ jako balı´k a ma ´ pr ˇ ı ´ponu .pm, hovor ˇ ı ´me o modulu Perl umoz ˇ n ˇ uje vtahovat jake´koliv soubory do programu (efekt je stejny´, jako kdybychom obsah souboru prˇekopı´rovali na pr ˇ ı ´slus ˇ ne ´ mı´sto), ale moduly poskytujı ´ i ne ˇ co navı´c. Pomocı ´ tzv mechanismu importu symbolu ˚ je umoz ˇne ˇ no, aby v jednom balı´ku byla pouz ˇ ı ´va ´ na jme ´ na objektu ˚ z jiny ´ ch balı´ku ˚ bez nutnosti plne ´ specifikace jejich jme ´ na (tzv. nemusı´me do jejich jme ´ na zahrnout na ´ zev balı´ku).
Podrobne ˇ se tvorbou a zava´de ˇnı´m modulu ˚ a exportem a importem symbolu ˚ zaby ´ va ´ kapitola 14. Moduly
Hlavnı´m du ˚ vodem pouz ˇ ı ´va ´ nı ´ modulu ˚ je znovupouzˇitelnost jiz ˇ jednou vytvor ˇ ene´ho ko ´ du. Programa´tor pak nemusı ´ sta´le dokola psa´t stejne ´ c ˇ a´sti programu, ale umı´stı ´ je do funkcı´, ktere ´ opakovane ˇ pouz ˇ ı ´va ´ . V distribuci Perlu je k dispozici cela ´ r ˇada standardnı´ch modulu ˚ (jejich seznam a popis je v kapitole 18. Standardnı´ moduly), je takte ´ z ˇ moz ˇ ne ´ najı´t a sta´hnout si moduly ze sı´te ˇ CPAN.
Zvla ´ sˇtnı´m typem modulu ˚ jsou tzv. pragmaticke ´ moduly, ktere ´ ovlivn ˇ ujı ´ proces pr ˇ ekladu zdrojove´ho ko ´ du programu. Asi nejcˇasteˇji pouz ˇ ı ´vany ´ m pragmatem je modul strict, ktery ´ vynucuje prˇi psanı ´ skriptu dodrz ˇ ova ´ nı ´ urcˇity ´ ch pravidel, ktera ´ jsou pr ˇ ı ´sneˇjs ˇ ı ´ nez ˇ bez tohoto modulu. Pragmaticky ´ mi moduly se podrobneˇji zaby ´ va ´ kapitola 19. Pragmaticke ´ moduly.
Regula ´ rnı ´ vy ´ razy
Velmi mocny ´ m na´strojem jazyka Perl jsou regula ´ rnı ´ vy ´ razy Ty jsou prostrˇedkem, ktery ´ umoz ˇ n ˇ uje prohleda´vat textova ´ data a nele´zat v nich c ˇ a´sti odpovı´dajı´cı ´ zadane ´ mu vzoru. Vy ´ sledkem takove´ho prohleda ´ va ´ nı ´ je nejcˇasteˇji informace o tom, zda text vzoru odpovı´da ´ nebo neodpovı´da ´ .
Regula ´ rnı ´ vy ´ raz je r ˇete ˇ zec, ktery ´ je tvor ˇ en podle urcˇity ´ ch pravidel. Neˇktere ´ symboly odpovı´dajı ´ samy sobe ˇ , jine ´ majı ´ specia´lnı ´ vy ´ znam hovor ˇ ı ´me o metaznacı´ch a metasymbolech (napr ˇ symbol \n odpovı´da ´ znaku konce r ˇ a´dku, \d je oznac ˇ enı ´ pro tr ˇ ı ´du znaku ˚ a odpovı´da ´ pra ´ ve ˇ jedne ´ jake´koliv c ˇ ı ´slici, + r ˇ ı ´ka ´ , z ˇ e prˇedcha´zejı´cı ´ c ˇ a´st se ma ´ v r ˇeteˇzci nacha´zet jednou a vı´cekra´t). Pomocı ´ tzv kvantifika´toru ˚ r ˇ ı ´ka ´ me, kolikra´t se majı ´ urcˇite ´ c ˇ a´sti vzoru opakovat. Mu ˚ z ˇ eme pouz ˇ ı ´vat i varianty vzoru ˚ cˇi jednotlive ´ nalezene ´ c ˇ a´sti zapamatovat a ulozˇit.
Pro pra´ci s regula ´rnı´mi vy ´ razy slouz ˇ ı ´ specia´lnı ´ opera´tory. Nejcˇasteˇji pouz ˇ ı ´vany ´ m je opera´tor m, ktery ´ pouze nalezne c ˇ a´st r ˇete ˇ zce odpovı´dajı´cı ´ vzoru, a opera´tor s, ktery ´ umı ´ nalezene ´ podrˇete ˇ zce nahradit jiny ´ m textem. if ($text =˜ m/\d+/) { print ”Hodnota $text je c ˇ ı ´slo”; else { print ”Hodnota $text nenı ´ c ˇ ı ´slo”; }
Vsˇechny podrobnosti ty ´ kajı´cı ´ se regula ´rnı´ch vy ´ razu ˚ se nacha´zejı ´ v kapitole 7. Regula ´ rnı ´ vy ´ razy.
DATOVE ´ TYPY
, PROME ˇ NNE ´
• Datove ´ typy podporovane ´ v Perlu
• Pra ´ ce s c ˇ ı ´sly a r ˇeteˇzci, vkla´da ´ nı ´ do r ˇete ˇ zcu ˚
• Typy prome ˇ nny ´ ch a pra ´ ce s nimi
• Standardnı ´ funkce pro pra´ci se skala ´rnı´mi a seznamovy ´ mi hodnotami
• Seznam a popis prˇeddefinovany ´ ch jmen
4. Datove ´ typy, prome ˇ
Na rozdı´l od neˇktery ´ ch programovacı´ch jazyku ˚ ma ´ Perl relativne ˇ maly ´ pocˇet datovy ´ ch typu ˚ . Neumoz ˇ n ˇ uje take ´ vytva ´ r ˇet nove ´ pojmenovane ´ abstraktnı ´ datove ´ typy jako napr ˇ ı ´klad v Pascalu nebo v C. Neznamena ´ to vsˇak, z ˇ e takove ´ veˇci nenı ´ moz ˇ ne ´ prove´st jiny ´ m zpu ˚ sobem je moz ˇ ne ´ napr ˇ ı ´klad pouz ˇ ı ´t objektove ˇ orientovane´ho pr ˇ ı ´stupu. I tak se ale v podstate ˇ nejedna ´ o vytvor ˇ enı ´ nove´ho typu, ale o vyuzˇitı ´ neˇkolika ma´lo be ˇ z ˇ ne ˇ pouz ˇ ı ´vany ´ ch mechanismu ˚ .
Datove ´ typy se vztahujı ´ jak k litera´lovy ´ m hodnota ´ m, tak i k prome ˇ nny ´ m. C ˇ asto je moz ˇ ne ´ hodnoty ru ˚ zny ´ ch typu ˚ zame ˇ n ˇ ovat bez toho, z ˇ e by prˇekladac ˇ hla´sil chybu, jak je tomu v pr ˇ ı ´sne ˇ typovany ´ ch programovacı´ch jazycı´ch.
Perl implementuje pouze trˇi za´kladnı ´ datove ´ typy skala ´ ry, pole skala ´ ru ˚ a hashe skala ´ ru ˚ (asociativnı ´ pole).
Skala ´ ry jsou za´kladnı´m datovy ´ m typem a tvor ˇ ı ´ se z nich ostatnı´, slozˇiteˇjs ˇ ı ´ datove ´ typy Uchova´vajı ´ jednu jedinou hodnotu, kterou mu ˚ z ˇ e by ´ t r ˇete ˇ zec, c ˇ ı ´slo nebo odkaz. Pole je uspor ˇ a´dany ´ seznam skala ´ ru ˚ , k jednotlivy ´ m hodnota ´ m se prˇistupuje pomocı ´ c ˇ ı ´selne´ho indexu (indexy zac ˇ ı ´najı ´ implicitne ˇ od 0). Hash je neuspor ˇ a´dana ´ mnozˇina dvojic klı´cˇ/hodnota. K hodnota ´ m se zde prˇistupuje pomocı ´ r ˇete ˇ zcovy ´ ch indexu ˚ zvany ´ ch klı´cˇe Skala ´ rnı ´ prome ˇ nna ´ mu ˚ z ˇ e obsahovat skala ´ rnı ´ hodnotu, prome ˇ nna ´ typu pole obsahuje seznamovou hodnotu, ktera ´ je cha ´ pa ´ na jako posloupnost jednoduchy ´ ch hodnot, a prome ˇ nna ´ typu hash obsahuje seznamovou hodnotu, jez ˇ je interpretova ´ na jako seznam neuspor ˇ a´dany ´ ch dvojic klı´cˇ/hodnota.
Identifika´tor prome ˇ nne ´ kazˇde´ho typu je uvozen zvla ´ sˇtnı´m znakem. Skala ´ rnı ´ prome ˇ nne ´ zac ˇ ı ´najı ´ znakem $ (prˇipomı´na ´ S jako Scalar), seznamy zac ˇ ı ´najı ´ znakem @ (prˇipomı´na ´ a jako array) a hashe zac ˇ ı ´najı ´ znakem % (prˇipomı´na ´ H jako Hash). Kazˇdy ´ typ prome ˇ nne ´ ma ´ svu ˚ j vlastnı ´ jmenny ´ prostor Znamena ´ to, z ˇ e pro skala ´ rnı ´ prome ˇ nnou je moz ˇ ne ´ pouz ˇ ı ´t stejne ´ jme ´ no jako pro prome ˇ nnou typu pole nebo hash. Tato jme ´ na se pak budou lisˇit pouze svy ´ m prvnı´m znakem.
Dı´ky tomu, z ˇ e jme ´ na prome ˇ nny ´ ch zac ˇ ı ´najı ´ specia´lnı´m znakem, se nemu ˚ z ˇ e sta´t, z ˇ e by se pletla s rezervovany ´ mi slovy, jak tomu mu ˚ z ˇ e by ´ t v jiny ´ ch programovacı´ch jazycı´ch. Tento proble ´ m vsˇak mu ˚ z ˇ e nastat napr ˇ . u jmen podprogramu ˚ cˇi ovladac ˇ u ˚ .
Jme ´ no prome ˇ nne ´ nemusı ´ by ´ t vzˇdy zna ´ mo v dobe ˇ prˇekladu, ale mu ˚ z ˇ e by ´ t urc ˇ eno az ˇ za beˇhu programu. Toho lze docı´lit tak, z ˇ e mı´sto jme ´ na prome ˇ nne ´ lze pouz ˇ ı ´t blok vracejı´cı ´ r ˇete ˇ zec nebo odkaz. Pokud blok vracı ´ odkaz, hovor ˇ ı ´me o dereferenci pevne´ho odkazu, pokud blok vracı ´ r ˇete ˇ zec, hovor ˇ ı ´me o symbolicke ´ m odkazu.
${’x’} = 1; # pracuje se s promeˇnnou $x
sub jmeno { return ’y’};
${ jmeno() } = 2; # pracuje se s promeˇnnou $y
$rx = \$x; # odkaz na promeˇnnou $x
${ $rx } = 123; # pracuje se s promeˇnnou $x
Jme ´ na prome ˇ nny ´ ch a odkazy na jejich hodnoty jsou ukla´da ´ ny ve dvou typech pameˇt’ovy ´ ch struktur. Ty se nazy ´ vajı ´ tabulky symbolu ˚ a lexika´lnı ´ prostory. Tabulky symbolu ˚ jsou vztaz ˇ eny vzˇdy k urcˇite ´ mu balı´ku, lexika´lnı ´ prostory se vztahujı ´ k bloku a nemajı ´ s tabulkami symbolu ˚ nic spolec ˇ ne´ho. To, kde bude prome ˇ nna ´ umı´ste ˇ na, je urc ˇ eno v okamzˇiku jejı ´ deklarace. Jestliz ˇ e prome ˇ nnou deklarujeme pomocı ´ funkce my, jedna ´ se o loka´lnı ´ prome ˇ nnou a bude umı´ste ˇ na do lexika´lnı´ho prostoru, v ostatnı´ch pr ˇ ı ´padech se jedna ´ o globa´lnı ´ prome ˇ nnou na´lezˇejı´cı ´ do tabulky symbolu ˚ . Vı´ce informacı ´ ty ´ kajı´cı´ch se tabulek symbolu ˚ , lexika´lnı´ch prostoru ˚ , deklaracı ´ a pra ´ ce se jme ´ ny prome ˇ nny ´ ch se nacha ´ zı ´ v kapitole 13. Balı´ky.
4.1 Skala
´ rnı ´ hodnoty a skala ´ rnı ´ prome ˇ nne ´
Skala ´ ry obsahujı ´ vzˇdy jednu jedinou hodnotu, kterou je r ˇete ˇ zec, c ˇ ı ´slo nebo odkaz na jina ´ data. Reprezentuje tedy vsˇechny celoc ˇ ı ´selne ´ typy, typy pracujı´cı ´ v pevne ´ i pohyblive ´ r ˇ a´dove ´ c ˇ a ´ rce, typy znakove ´ i r ˇete ˇ zcove ´ Ve skutecˇnosti nelze r ˇ ı ´ci, z ˇ e skala ´ r obsahuje hodnotu neˇjake´ho konkre´tnı´ho typu. Nenı ´ tedy napr ˇ ı ´klad moz ˇ ne ´ r ˇ ı ´ci, z ˇ e prome ˇ nna ´ $x je celoc ˇ ı ´selna ´ prome ˇ nna ´ nebo prome ˇ nna ´ typu znak. Se skala ´ rnı ´ prome ˇ nnou nebo hodnotou se zacha ´ zı ´ podle toho, jaky ´ m zpu ˚ sobem ji programa´tor pouzˇije (za´lez ˇ ı ´ na opera´torech ve vy ´ razu, kde se prome ˇ nna ´ objevuje). Znamena ´ to, z ˇ e v jednom okamzˇiku je moz ˇ ne ´ s takovou prome ˇ nnou zacha´zet jako s c ˇ ı ´slem a jindy jako s r ˇete ˇ zcem. Bez ohledu na obsah prome ˇ nne ´ nebude prˇekladac ˇ em ani v jenom pr ˇ ı ´pade ˇ zahla ´ s ˇ ena chyba a za´lez ˇ ı ´ na programa´torovi, aby si pohlı´dal, jaka ´ data prome ˇ nna ´ obsahuje a k jake ´ mu u ´ cˇelu jsou tato data vyuz ˇ ı ´va ´ na. Pr ˇ ı ´padne ´ konverze z c ˇ ı ´sla na r ˇete ˇ zec a naopak se prova´deˇjı ´ automaticky bez upozorne ˇnı´. To mu ˚ z ˇ e by ´ t v neˇktery ´ ch pr ˇ ı ´padech zdrojem chyb, jez ˇ nejsou na prvnı ´ pohled patrne ´ , a proto se te ˇ zˇko odhalujı´.
Poneˇkud komplikovaneˇjs ˇ ı ´ situace je prˇi pra´ci s odkazy. Je sice moz ˇ ne ´ prove´st automatickou konverzi odkazu na c ˇ ı ´slo nebo r ˇete ˇ zec, ale krome ˇ mozˇnosti porovna ´ nı ´ takovy ´ ch hodnot c ˇ ı ´ zjisˇte ˇ nı ´ typu odkazu to nema ´ smysl. Pouzˇitı ´ odkazu jako r ˇete ˇ zce vede k tomu, z ˇ e je pouzˇita r ˇete ˇ zcova ´ reprezentace odkazu (napr ˇ . SCALAR(0x1a950e0)), jestliz ˇ e odkaz pouzˇijeme jako c ˇ ı ´slo, zı´ska ´ me neˇkolikamı´stne ´ cele ´ c ˇ ı ´slo. Je samozrˇejme ´ , z ˇ e pro dva ru ˚ zne ´ odkazy dostaneme vzˇdy dve ˇ ru ˚ zne ´ c ˇ ı ´selne ´ nebo r ˇete ˇ zcove ´ reprezentace. Zpeˇtna ´ konverze takovy ´ chto hodnot na odkaz je vsˇak nemoz ˇ na ´ .
V Perlu neexistuje nic jako logicky ´ typ (napr ˇ . boolean v Pascalu). Pro uchova ´ nı ´ logicke ´ hodnoty lze pouz ˇ ı ´t prome ˇ nnou jake´hokoliv typu. Za´lez ˇ ı ´ na tom, v jake ´ m vy ´ razu a kontextu tuto prome ˇ nnou pouzˇijeme. Chceme-li z neˇjake ´ prome ˇ nne ´ logickou hodnotu (pravda nebo nepravda) zı´skat, r ˇ ı ´dı ´ se vs ˇ e pravidly o pravdivosti. Pouzˇijeme-li k uchova ´ nı ´ cˇi zjisˇte ˇ nı ´ logicke ´ hodnoty skala ´ r, pro nepravdivou hodnotu do neˇj uloz ˇ ı ´me hodnotu nula, pra´zdny ´ r ˇete ˇ zec, r ˇete ˇ zec obsahujı´cı ´ znak nula cˇi nedefinovanou hodnotu. Pravdiva ´ hodnota bude vsˇechno ostatnı´. Pouzˇijeme-li pro logickou hodnotu pole, nepravdive ´ bude vyhodnocenı ´ pra´zdne´ho pole ve skala ´rnı´m kontextu (hodnota 0, coz ˇ je de´lka pole, viz da´le).
$x = 1; # $x je pravdive
$x = 0; # $x je nepravdive ´
$x = ”0”; # $x je nepravdive
$x = undef; # $x je nepravdive ´ @pole = (); # @pole ve skala´rnı´m kontextu je nepravdive @pole = undef; # @pole ve skala´rnı´m kontextu je pravdive´, # protozˇe obsahuje jeden prvek
Nedefinovana ´ hodnota
Je-li pouzˇita skala ´ rnı ´ prome ˇ nna ´ poprve ´ a nenı ´ jı ´ prˇir ˇ azena z ˇ a´dna ´ hodnota, r ˇ ı ´ka ´ me, z ˇ e obsahuje nedefinovanou hodnotu Nedefinovana ´ hodnota take ´ indikuje, z ˇ e pro ne ˇ co skutec ˇ na ´ hodnota neexistuje a neˇkdy se pouz ˇ ı ´va ´ pro oznac ˇ enı ´ chybove´ho stavu. Je tomu tak napr ˇ ı ´klad v pr ˇ ı ´pade ˇ , kdy chceme pracovat s neexistujı´cı´m prvkem pole nebo hashe nebo jsme prˇi cˇtenı ´ souboru dosˇli na jeho konec. K tomu, aby bylo moz ˇ ne ´ zjistit, zda je hodnota skala ´ rnı ´ prome ˇ nne ´ definova ´ na, slouz ˇ ı ´ una ´ rnı ´ opera´tor defined, ktere ´ mu jako argument prˇeda ´ me pr ˇ ı ´slus ˇ nou prome ˇ nnou (vy ´ raz). Prˇi pra´ci s prome ˇ nnou typu pole nebo hash jako s celkem nema ´ z ˇ a´dny ´ vy ´ znam o definovanosti uvazˇovat, protoz ˇ e to jsou kolekce skala ´ ru ˚ Pokud zjisˇt’ujeme definovanost pole nebo hashe, za´visı ´ vy ´ sledek na tom, zda byl pro tuto prome ˇ nnou alokova ´ n prostor v pameˇti. Prˇir ˇ azenı ´ nedefinovane ´ hodnoty do pole ma ´ za na´sledek vznik pole o jednom prvku, jehoz ˇ hodnota je nedefinovana ´ Prˇi prˇir ˇ azenı ´ do hashe vznikne hash o jedne ´ dvojici nedefinovany ´ ch hodnot. Navı´c je ocˇeka ´ va ´ n sudy ´ pocˇet hodnot (dvojic klı´cˇ/hodnota), jedna hodnota by tedy chybeˇla. Oba dva pr ˇ ı ´pady by zpu ˚ sobily varova ´nı´.
Vestave ˇ na ´ funkce undef vracı ´ nedefinovanou hodnotu a tu je moz ˇ ne ´ pouz ˇ ı ´t napr ˇ ı ´klad v prˇir ˇ azenı ´ pro zrus ˇ enı ´ hodnoty prome ˇ nne ´ nebo jako na´vratovou hodnotu funkce, ktera ´ bude indikovat neu ´ speˇch.
C ˇ ı ´sla
V Perlu rozlisˇujeme c ˇ ı ´sla cela ´ a c ˇ ı ´sla v pohyblive ´ r ˇ a´dove ´ c ˇ a ´ rce. Interne ˇ Perl ukla´da ´ c ˇ ı ´sla jako c ˇ ı ´sla v pohyblive ´ r ˇ a´dove ´ c ˇ a ´ rce s dvojna´sobnou prˇesnostı ´ (pokud ovs ˇ em nezaka ´ z ˇ eme pouz ˇ ı ´va ´ nı ´ rea´lny ´ ch c ˇ ı ´sel pomocı ´ use integer). C ˇ ı ´selne ´ hodnoty lze zapisovat neˇkolika zpu ˚ soby.
Tab. 4–1: Pr ˇ ı ´klady za´pisu ˚ cˇı´selny´ch hodnot
Hodnota Vy ´ znam
12345 cele ´ c ˇ ı ´slo kladne ´ -123 cele ´ c ˇ ı ´slo za ´ porne ´
Hodnota Vy ´ znam
123.456 c ˇ ı ´slo s desetinnou c ˇ a´rkou kladne ´ -123.456 c ˇ ı ´slo s desetinnou c ˇ a´rkou za ´ porne ´ 1.23E16 v semilogaritmicke ´ m tvaru (1 23 ∗ 1016) -12e34 velke ´ za ´ porne ´ c ˇ ı ´slo ( 12 ∗ 1034)
-12e-34 velmi male ´ za ´ porne ´ c ˇ ı ´slo ( 12 ∗ 10 34)
0xFF, 0X2e sˇestna´ctkove ´ c ˇ ı ´slo (mu ˚ z ˇ e by ´ t male ´ x i velke ´ X) 0247 osmicˇkove ´ c ˇ ı ´slo (0 na zac ˇ a´tku)
0b111000 bina ´ rnı ´ c ˇ ı ´slo (pouze male ´ b)
0b111_000 bina ´ rnı ´ c ˇ ı ´slo s podtrz ˇ ı ´tkem
1_123_456_789 s podtrz ˇ ı ´tky pro zvy ´ s ˇ enı ´ cˇitelnosti
0xFF_FF_AA s podtrz ˇ ı ´tky pro zvy ´ s ˇ enı ´ cˇitelnosti
1__23_4e12_34 s podtrz ˇ ı ´tky pro snı´z ˇ enı ´ cˇitelnosti :-)
Pro oddeˇlenı ´ cele ´ a desetinne ´ c ˇ a´sti se pouz ˇ ı ´va ´ tecˇka, c ˇ a´rka je opera´tor oddeˇlujı´cı ´ jednotlive ´ prvky seznamu. Kdekoliv mimo zac ˇ a´tek litera´lu je moz ˇ ne ´ pro zvy ´ s ˇ enı ´ cˇitelnosti pouz ˇ ı ´t znaku podtrz ˇ ı ´tko (jeden nebo vı´ce vy ´ skytu ˚ ). Te´to formy lze pouz ˇ ı ´vat pouze u konstant prˇi psanı ´ programu. Pokud jsou tato c ˇ ı ´sla zı´ska ´ na napr ˇ ı ´klad jako vstup programu cˇtenı´m ze souboru (coz ˇ jsou v podstate ˇ r ˇeteˇzce), bude jako c ˇ ı ´slo brana ´ c ˇ a´st pouze po prvnı ´ podtrz ˇ ı ´tko (viz Automaticke ´ konverze mezi r ˇeteˇzci a cˇı´sly). Stejne ˇ tak sˇestna´ctkova ´ a osmicˇkova ´ c ˇ ı ´sla na zac ˇ a´tku s 0x nebo 0 jsou rozpozna ´ na pouze v pr ˇ ı ´pade ˇ , z ˇ e se jedna ´ o litera´ly Chceme-li pracovat s takovy ´ mi c ˇ ı ´sly zadany ´ mi ve forme ˇ r ˇete ˇ zce jako s c ˇ ı ´sly v dane ´ soustave ˇ , musı´me pouz ˇ ı ´t konverznı ´ funkce hex nebo oct
Pro pra´ci s c ˇ ı ´sly je moz ˇ ne ´ pouz ˇ ı ´t standardnı ´ moduly Math::*. Ty umoz ˇ n ˇ ujı ´ pracovat s libovolne ˇ velky ´ mi cely ´ mi i desetinny ´ mi c ˇ ı ´sly, raciona´lnı´mi c ˇ ı ´sly (zlomky) cˇi komplexnı´mi c ˇ ı ´sly.
R ˇ ete ˇ zce
R ˇ ete ˇ zce jsou posloupnosti znaku ˚ cha ´ pane ´ dohromady jako jeden skala ´ r a nenı ´ moz ˇ ne ´ pr ˇ ı ´mo prˇistupovat ke kazˇde ´ mu jednotlive ´ mu znaku.∗ Minima´lnı ´ de´lka r ˇete ˇ zce je nulova ´ a maxima´lnı ´ de´lka je omezena ´ velikostı ´ dostupne ´ pameˇti. Aktua´lnı ´ de´lka r ˇete ˇ zce se dynamicky me ˇ nı ´ podle toho, jak s nı´m pracujeme.
Za´lez ˇ ı ´ na pouzˇite ´ znakove ´ sade ˇ , kolik mı´sta v pameˇti bude zabı´rat jeden znak.
Ve znakove ´ sade ˇ o de´lce znaku 8 bitu ˚ (ASCII) bude de´lka jednoho znaku jeden byte. Znaky Unicode mohou zabı´rat bytu ˚ vı´ce (znak v UTF8 jeden az ˇ sˇest bytu ˚ ). Pokud bychom i s takovy ´ mi r ˇeteˇzci chteˇli pracovat po bytech, musı´me zave´st pragmaticky ´ modul bytes
∗ Nektere programovacı jazyky chapou retezce jako slozeny datovy typ a jednotlive znaky jsou brany samostatne ˇ . Take ´ proto je k nim moz ˇ ne ´ prˇistupovat pomocı ´ c ˇ ı ´selny ´ ch indexu ˚ .
Pokud se v programu objevujı ´ r ˇete ˇ zcove ´ litera´ly, zada´vajı ´ se pomocı ´ r ˇete ˇ zcovy ´ ch opera´toru ˚ . Rozlisˇujeme dve ˇ za´kladnı ´ skupiny teˇchto opera´toru ˚ tam, kde probı´ha ´ vkla´da ´ nı ´ hodnot prome ˇ nny ´ ch a specia´lnı´ch sekvencı´, a tam, kde neprobı´ha ´ . Za´kladnı´mi verzemi teˇchto opera´toru ˚ jsou uvozovky (zde vkla´da ´ nı ´ probı´ha´) a apostrofy (zde vkla´da ´ nı ´ neprobı´ha´)∗ . Da´le existujı ´ obdoby teˇchto opera´toru ˚ , ktere ´ vsˇak majı ´ stejne ´ chova ´nı´, lis ˇ ı ´ se pouze vzhledem. Jak jsou kompila´torem r ˇete ˇ zcove ´ konstanty zpracova ´ va ´ ny, jak probı´ha ´ vkla´da ´ nı ´ hodnot apod. je podrobne ˇ popsa ´ no v kapitole 6. Opera´tory v c ˇ a´sti Termy a seznamove ´ opera´tory (vlevo).
Je-li neˇkde zapsa ´ n litera´l zac ˇ ı ´najı´cı ´ pı´smenem v na´sledovany ´ posloupnostı ´ c ˇ ı ´sel
oddeˇleny ´ ch tecˇkami, jedna ´ se o za´pis r ˇete ˇ zce pomocı ´ ordina´lnı´ch c ˇ ı ´sel jeho jednotlivy ´ ch znaku ˚ (tyto r ˇete ˇ zce se nazy ´ vajı ´ Version strings, nebo take ´ v-strings). Obsahuje-li litera´l dve ˇ a vı´ce tecˇek, nenı ´ nutne ´ poc ˇ a´tec ˇ nı ´ v psa´t (v opac ˇ ne ´ m pr ˇ ı ´pade ˇ by tento za´pis byl povaz ˇ ova ´ n za desetinne ´ c ˇ ı ´slo). Takto zapsany ´ r ˇete ˇ zec se nepı´s ˇ e do uvozovek.
v97.105.111.107 # to same ´ jako ’ahoj’ 97.105.111.107 # to same ´ jako v97.105.111.107
Po verzi Perlu 5.8 by tento zpu ˚ sob zada ´ va ´ nı ´ r ˇete ˇ zcovy ´ ch litera ´ lu ˚ nemeˇl by ´ t moz ˇny´.
Vkla´da ´ nı ´ do r ˇete ˇ zcu ˚ R ˇ ete ˇ zce v uvozovka´ch podle´hajı ´ vkla´da ´ nı ´ hodnot prome ˇ nny ´ ch a specia´lnı´ch sekvencı ´ zac ˇ ı ´najı´cı´ch obra ´ ceny ´ mi lomı´tky podobne ˇ jako v UNIXove ´ m shellu. Neˇktere ´ znaky ve spojenı ´ s obra ´ ceny ´ m lomı´tkem zı´ska´vajı ´ specia´lnı ´ vy ´ znam jsou zna ´ my jako escape sekvence cˇi metaznaky. Obsahuje-li prome ˇ nna ´ $den hodnotu pondeˇlı ´ , pr ˇ ı ´kaz
print ”Dnes je $den\n”;
vypı´s ˇ e text Dnes je pondeˇlı ´ a odr ˇ a´dkuje.
Dı´ky tomu, z ˇ e jme ´ no prome ˇ nne ´ zac ˇ ı ´na ´ specia´lnı´m symbolem, nenı ´ trˇeba prˇi vkla ´da ´ nı ´ jejı ´ hodnody do r ˇete ˇ zce pouz ˇ ı ´vat zvla ´ sˇtnı ´ syntaxi.
Je-li nalezen znak $, povazˇuje se za zac ˇ a´tek jme ´ na prome ˇ nne ´ . Potom se vezme vsˇechno, co na´sleduje a vypada ´ jako jme ´ no prome ˇ nne ´ , tedy r ˇete ˇ zec $den (znak \ uz ˇ nemu ˚ z ˇ e by ´ t souc ˇ a´stı ´ jme ´ na prome ˇ nne´) a hodnota te´to prome ˇ nne ´ se do r ˇete ˇ zce vloz ˇ ı ´. Sekvence \n znamena ´ prˇechod na dals ˇ ı ´ r ˇ a´dek (je to oznac ˇ enı ´ znaku konce r ˇ a´dku).
Chceme-li ovlivnit zpu ˚ sob, jaky ´ m Perl vyhleda ´ va ´ jme ´ no prome ˇ nne ´ prˇi vkla´da ´ nı ´ jejı ´ hodnoty do r ˇete ˇ zce, mu ˚ z ˇ eme pouz ˇ ı ´t dvojice znaku ˚ { a }
$x = 3; $y = 5; print ”${x}x$y=”, $x*$y; # vytiskne 3x5=15
∗ V originalnı anglicke dokumentaci se retezce v uvozovkach nazyvajı „double-quoted“ a retezce v apostrofech „single-quoted“.
Bez pouzˇitı ´ sloz ˇ eny ´ ch za ´vorek by se za jme ´ no prome ˇ nne ´ povazˇoval r ˇete ˇ zec $xx. Takova ´ prome ˇ nna ´ v nas ˇ em pr ˇ ı ´pade ˇ neexistuje, proto bychom nedostali pozˇadovany ´ vy ´ stup.
Do r ˇete ˇ zcu ˚ je moz ˇ ne ´ vkla´dat i hodnoty z prome ˇ nny ´ ch typu pole. V takove ´ m pr ˇ ı ´pade ˇ je mezi jednotlive ´ prvky pole vloz ˇ en obsah prome ˇ nne ´ $” ($LIST_SEPARATOR) implicitne ˇ je tam uloz ˇ ena jedna mezera a vznikly ´ r ˇete ˇ zec je potom do r ˇete ˇ zce vloz ˇ en. Prˇir ˇazenı´m jine ´ hodnoty do te´to prome ˇ nne ´ je moz ˇ ne ´ zpu ˚ sob vkla´da ´ nı ´ zmeˇnit.
@pole = (1, 2, 3);
print ”Obsah pole je: @pole”; # vytiskne ’obsah pole je: 1 2 3’
$” = ’+’; # zmeˇna oddeˇlovace prvku ˚ pole print ”@pole”; # vytiskne ’1+2+3’
Je trˇeba rozlisˇit pr ˇ ı ´pad, kdy je funkcı ´ print vypisova ´ no pole (nebo seznam) bez vloz ˇ enı ´ do r ˇete ˇ zce. Prvky pole jsou v tomto pr ˇ ı ´pade ˇ oddeˇleny r ˇete ˇ zcem uloz ˇ eny ´ m v prome ˇ nne ´ $, ($OUTPUT_FIELD_SEPARATOR).
Krome ˇ hodnot prome ˇ nny ´ ch je moz ˇ ne ´ do r ˇete ˇ zcu ˚ vkla´dat i znaky popsane ´ urcˇitou sekvencı ´ znaku ˚ , oznac ˇ ovanou jako escape sekvence (metaznak) jejich seznam se nacha ´ zı ´ v na´sledujı´cı ´ tabulce.
Tab. 4–2: Escape sekvence prˇi vkla´da ´ nı ´ do r ˇete ˇ zcu ˚
Symbol Vy ´ znam
\n novy ´ r ˇ a´dek
\r na´vrat vozı´ku
\t tabula´tor
\f nova ´ stra´nka
\b backspace
\a pı´pnutı ´ \e znak ESC
\101, 012 znaky s ASCII hodnotou osmicˇkove ˇ (znaky A a \n)
\x61 znak s ASCII hodnotou sˇestna´ctkove ˇ (pı´smeno a)
\cC znak CTRL+C
\x{263a} znak ve znakove ´ sade ˇ Unicode
\N{JME ´ NO} znak se zadany ´ m jme ´ nem∗ \\ znak \
∗ Vı´ce v kapitole 19. Pragmaticke ´ moduly, modul charnames
Da´le existujı ´ neˇktere ´ sekvence, ktere ´ ovlivn ˇ ujı ´ reprezentaci na´sledujı ´ znaku ˚ . Tyto sekvence se nazy ´ vajı ´ modifika´tory.
Tab. 4–3: Modifika´tory prˇi vkla´da ´ nı ´ do r ˇete ˇ zcu ˚
Symbol Vy ´ znam
\u prˇevede na´sledujı´cı ´ znak na velke ´ pı´smeno
\l prˇevede na´sledujı´cı ´ znak na male ´ pı´smeno \U prˇevede na´sledujı´cı ´ znaky na velka ´ pı´smena \L prˇevede na´sledujı´cı ´ znaky na mala ´ pı´smena
\Q na´sledujı´cı ´ nealfanumericke ´ znaky uvede obra ´ ceny ´ m lomı´tkem
\E ukoncˇuje \U, \L, \Q
Modifika´tor \E se vztahuje vzˇdy k nejbliz ˇ s ˇ ı ´mu prˇedchozı´mu modifika´toru. Nerus ˇ ı ´ tedy platnost vsˇech ostatnı´ch. Je to videˇt na poslednı´m r ˇ a´dku na´sledujı´cı´ho pr ˇ ı ´kladu.
$x = ’abcDEF’; $y = ’ABCdef’; $z = ’a+b=1’; print ”\u$x \l$y”; # vytiskne ’AbcDEF aBCdef’ print ”\U$x \L$y”; # vytiskne ’ABCDEF abcdef’ print ”\Q$z”; # vytiskne ’a\+b\=1’ print ”\Q\U$z \E$z \E$z”; # vytiskne ’A\+B\=1\ a\+b\=1\ a+b=1’
Do c ˇ a´sti r ˇete ˇ zce, kde platı ´ modifika´tor \Q, nenı ´ moz ˇ ne ´ vlozˇit litera´l $ nebo @. Na tyto symboly je totiz ˇ pohlı´z ˇ eno jako na zac ˇ a´tky jmen prome ˇ nny ´ ch, jejichz ˇ hodnoty budou do r ˇete ˇ zce vkla´da ´ ny. Umı´stı´me-li prˇed tyto symboly obra ´ cene ´ lomı´tko, bude tento jejich vy ´ znam potlac ˇ en, avsˇak pomocı ´ sekvence \Q se prˇed ne ˇ doplnı ´ obra ´ cene ´ lomı´tko. R ˇ es ˇenı´m nenı ´ ani vloz ˇ enı ´ tohoto symbolu jako hodnoty jine ´ prome ˇ nne ´ cˇi pomocı ´ ordina´lnı ´ hodnoty
$x = ”1+2”;
$y = ”aaa\Q$x\Eaaa”; # $y obsahuje ’aaa1\+2aaa’
$y = ”aaa\Q\$x\Eaaa”; # $y obsahuje ’aaa\$xaaa’; $dolar = ’$’;
$y = ”aaa\Q$dolar”; # $y obsahuje ’aaa\$’; $y = ”aaa\Q\44\Eaaa”; # $y obsahuje ’aaa\$xaaa’;
ˇ
ˇ
R
ete
zec v obra ´ ceny´ch apostrofech
R ˇ ete ˇ zec uvedeny ´ v obra ´ ceny ´ ch apostrofech nenı ´ r ˇete ˇ zcovy ´ m litera´lem, ale je za´pisem pro zı´ska ´ nı ´ vy ´ stupu z provedenı ´ externı´ho pr ˇ ı ´kazu, jehoz ˇ jme ´ no je uvnitr ˇ apostrofu ˚ uvedeno (stejne ˇ jako v UNIXove ´ m shellu). I v teˇchto r ˇete ˇzcı´ch vsˇak probı´ha ´ vkla´da ´ nı ´ hodnot prome ˇ nny ´ ch a escape sekvencı´.
print ‘\144\151\162‘; # to same jako print ‘dir‘, # ve Windows vypı´sˇe obsah adresa´rˇe
Vı´ce se tomuto opera´toru budeme veˇnovat v kapitole 20. Komunikace s pr ˇ ı ´kazovy ´ m interpretem a ostatnı´mi procesy.
R ˇ ete ˇ zce v apostrofech
V r ˇete ˇ zcovy ´ ch litera´lech ohranic ˇ eny ´ ch jednoduchy ´ mi apostrofy vkla´danı ´ neprobı´ha ´ , jediny ´ mi vy ´ jimkami je vkla´da ´ nı ´ znaku ’ pomocı ´ sekvence \’∗ a znaku \ pomocı ´ \\
Vlastnı ´ zpu˚sob ohranic ˇ enı ´ r ˇete ˇ zce
Perl umoz ˇ n ˇ uje vlastnı ´ volbu ohranic ˇ enı ´ r ˇete ˇ zce (jinak nez ˇ pomocı ´ opera´toru ˚ ”” , ’’ a ‘‘). K tomu slouz ˇ ı ´ prˇeddefinovane ´ funkce (opera´tory), jejichz ˇ argumentem je r ˇete ˇzec ohranic ˇ eny ´ dve ˇ ma ohranic ˇovacı´mi symboly Tyto symboly mohou by ´ t libovolne ´ znaky, krome ˇ bı´ly ´ ch znaku ˚ Na´sledujı´cı ´ tabulka ukazuje zpu ˚ soby ohranic ˇ enı ´ r ˇete ˇ zcu ˚ (a objektu ˚ , ktere ´ jsou zpracova ´ va ´ ny podobne ˇ jako r ˇeteˇzce) a jejich ekvivalenty zapsane ´ pomocı ´ opera´toru ˚ s nejbe ˇ z ˇ neˇji pouz ˇ ı ´vany ´ mi ohranic ˇovacı´mi znaky
Tab. 4–4: Zpu ˚ soby ohranicˇenı´ r ˇete ˇ zce
Obycˇejne ˇ Jinak Vy ´ znam Vkla´da ´ nı ´
’’ q// litera´lovy ´ r ˇete ˇ zec ne
”” qq// litera´lovy ´ r ˇete ˇ zec s vkla´da ´nı´m ano () qw// seznam r ˇete ˇ zcu ˚ ne // m// nalezenı ´ vzoru ano s/// s/// nahrazenı ´ ano y/// tr/// prˇeklad ne ”” qr// regula ´ rnı ´ vy ´ raz ano
Vy ´ hodou pouzˇitı ´ vlastnı´ho ohranic ˇovacı´ho symbolu je to, z ˇ e nenı ´ trˇeba prˇed kazˇdy ´ m symbolem, ktery ´ by jinak znamenal ukonc ˇ enı ´ r ˇete ˇ zce, pouz ˇ ı ´vat obra ´ cene ´ lomı´tko. Pomocı ´ tohoto zpu ˚ sobu za´pisu je napr ˇ . moz ˇ ne ´ docı´lit toho, z ˇ e nenı ´ nutne ´ prˇed kazˇdy ´ m apostrofem (pr ˇ ı ´padne ˇ uvozovkou) v r ˇeteˇzci psa´t obra ´ cene ´ lomı´tko proto, aby bylo jasne ´ , z ˇ e tı´mto znakem nenı ´ r ˇete ˇ zec ukonc ˇ en. Tı´m se zvy ´ s ˇ ı ´ cˇitelnost a snı´z ˇ ı ´ se riziko toho, z ˇ e neˇkde obra ´ cene ´ lomı´tko zapomeneme uve´st. Proto jako ∗ Toto pravidlo se pr ˇ esneˇji r ˇ ec ˇ eno ty ´ ka ´ symbolu, ktery ´ je pouzˇit pro ohranic ˇ enı ´ r ˇete ˇ zce. Ve velke ´ c ˇ a ´ sti to je apostrof. Vı´ce viz kapitola 6. Opera´tory, c ˇ a ´ st Termy a seznamove ´ opera´tory (vlevo)
ohranic ˇ ovacı ´ symbol volı´me takovy ´ znak, ktery ´ se v r ˇeteˇzci vyskytne co nejme ´ neˇkra´t, nejle ´ pe vu ˚ bec.∗
Mezi jme ´ nem opera´toru a poc ˇ a´tec ˇnı´m ohranic ˇovacı´m symbolem mohou by ´ t bı´le ´ znaky Vy ´ jimku tvor ˇ ı ´ znak # Ten bude cha ´ pa ´ n jako zac ˇ a´tek komenta ´ r ˇ e a jedna ´ se tedy o chybu.
$x = ”Petr pozdravil: \”Ahoj!\””;
$x = qq/Petr pozdravil: ”Ahoj!”/; # jinak, prˇehledneˇji
$x = qq /Petr pozdravil: ”Ahoj!”/; # jinak, s mezerou
$x = qq#Petr pozdravil: ”Ahoj!”#; # s jiny´m ohranicovacı´m symbolem
$x = q #abc#; # r ˇeteˇzec #abc# je cha´pa´n jako komeˇnta´r - chyba
Jako ohranic ˇ ovacı ´ znak mu ˚ z ˇ e by ´ t pouzˇito i pı´smeno, c ˇ ı ´slice nebo podtrz ˇ ı ´tko (symboly, ktere ´ tvor ˇ ı ´ identifika´tory). V takove ´ m pr ˇ ı ´pade ˇ ale musı ´ by ´ t mezi jme ´ nem opera´toru a prvnı´m ohranic ˇovacı´m symbolem mezera, jinak by bylo vs ˇ e cha ´ pa ´ no jako jeden celek (jme ´ no opera´toru). Je tedy vhodneˇjs ˇ ı ´ pouz ˇ ı ´vat nealfanumericke ´ znaky, protoz ˇ e se zvy ´ s ˇ ı ´ cˇitelnost programu.
$y = ’111’;
$x = qq xabcx; # to same jako ”abc”
$x = qq xa${y}bx; # to same ´ jako ”a${y}b”
$x = qqxabcx; # to same ´ jako $x = qqxabcx, # tzn. pouzˇitı ´ hole´ho slova $text =˜ m m\m$m; # to same ´ jako m/m$/m, tzn. hleda´me # ’m’ na konci r ˇa´dku
Pouzˇijeme-li jako poc ˇ a´tec ˇ nı ´ ohranic ˇ ovacı ´ znak otevı´racı ´ za´vorku (kulatou ((), sloz ˇ enou ({), hranatou ([) nebo sˇpicˇatou (<)), bude jako ukonc ˇ ovacı ´ znak ocˇeka ´ va ´ na uzavı´racı ´ za´vorka stejne´ho typu.
$x = q[abc123]; # $x obsahuje ’abc’ $x =˜ s{\d}<X>g; # nahradı ´ c ˇ ı ´slice znakem X, # $x ted’ obsahuje ’abcXXX’
Obsahuje-li r ˇete ˇ zec i ohranic ˇ ovacı ´ symbol, musı ´ by ´ t uvozen znakem obra ´ cene´ho lomı´tka, jinak bude povaz ˇ ova ´ n za konec r ˇete ˇ zce. Pouzˇijeme-li jako ohranic ˇovacı´ho znaku libovolny ´ typ za ´vorek a r ˇete ˇ zec bude obsahovat vnor ˇ ene ´ za´vorky stejne´ho typu (ale vzˇdy v pa´ru), nenı ´ nutne ´ prˇed nimi obra ´ cene ´ lomı´tko uva´deˇt (nenı ´ to ale chyba).
∗ Blı´z ˇ e je o zpracova ´ nı ´ r ˇete ˇ zcovy ´ ch a podobny ´ ch termu ˚ pojedna ´ no v kapitole 6. Opera´tory (c ˇ a ´ st Termy a seznamove ´ opera´tory (vlevo)) a v kapitole 7. Regula ´ rnı ´ vy ´ razy (c ˇ a ´ st Zpracova ´ nı ´ vzoru – prˇevedenı ´ do internı ´ formy).
$x = q$aaa\$bbb$; # ’aaa$bbb’
$x = q{a{b}c}; # ’a{b}c’
$x = q{a\{b\}c}; # ’a{b}c’
$x = q{a{b\}c}; # chyba
Na zvolene ´ m ohranic ˇovacı´m symbolu take ´ za´visı ´ to, zdali bude uvnitr ˇ r ˇete ˇ zce probı´hat vkla´da ´ nı ´ hodnot prome ˇ nny ´ ch a escape sekvencı´, nebo nebude. U opera´toru q// nebude probı´hat nikdy, u ostatnı´ch opera´toru ˚ v pr ˇ ı ´padech, z ˇ e jako ohranic ˇ ovacı ´ znak nebude pouzˇit apostrof.
Vı ´ cer ˇ a´dkove ´ r ˇete ˇ zce
V Perlu je umoz ˇ ne ˇ no pracovat s neˇkolikar ˇ a´dkovy ´ m textem jako s r ˇete ˇ zcem. Poc ˇ a ´tec ˇnı´m ohranic ˇovacı´m symbolem je << Bezprostrˇedne ˇ potom na´sleduje posloupnost znaku ˚ , kterou cely ´ text bude koncˇit. Tato posloupnost pak musı ´ zac ˇ ı ´nat na nove ´ m r ˇ a´dku a za nı ´ musı ´ na´sledovat znak konce r ˇ a´dku. Je-li r ˇete ˇ zec za << v uvozovka´ch nebo bez uvozovek, pracuje se s cely ´ m textem jako s r ˇete ˇ zcem v uvozovka´ch. Je-li posloupnost znaku ˚ v apostrofech, s textem se pracuje jako s r ˇete ˇ zcem v apostrofech. Text v obra ´ ceny ´ ch apostrofech je povaz ˇ ova ´ n za externı ´ pr ˇ ı ´kazy, ktere ´ jsou postupne ˇ vykona ´ ny
print <<KONEC_TEXTU;
prvnı ´ r ˇa´dek textu druhy ´ r ˇa´dek textu
KONEC_TEXTU
print <<”KONEC_TEXTU”; prvnı ´ r ˇa´dek textu druhy ´ r ˇa´dek textu
KONEC_TEXTU
# oba prˇı´pady fungujı ´ stejneˇ, uvnitr ˇ docha´zı ´ # ke vkla´da´nı ´ hodnot promeˇnny´ch apod.
print <<’KONEC_TEXTU’; prvnı ´ r ˇa´dek textu druhy ´ r ˇa´dek textu
KONEC_TEXTU
# uvnitr ˇ nedocha´zı ´ ke vkla´da´nı ´ hodnot promeˇnny´ch apod.
print <<‘KONEC_PRIKAZU‘; echo ’Aktualni adresar’ pwd
echo ’Obsach adresare:’ ls -l
KONEC_PRIKAZU
# provede uvedene prˇı´kazy
Je-li vı´cer ˇ a´dkovy ´ r ˇete ˇ zec souc ˇ a´stı ´ vy ´ razu nebo na´sleduje-li dals ˇ ı ´ pr ˇ ı ´kaz, musı ´ by ´ t spra ´ vne ˇ oddeˇlen (strˇednı´kem, c ˇ a´rkou, opera´torem apod.). Tento oddeˇlovac ˇ na´sleduje za << a slovem oznacˇujı´cı´m ukonc ˇ enı ´ cele´ho r ˇete ˇ zce nebo za cely ´ m r ˇete ˇ zcem (je trˇeba ale da´vat pozor na to, z ˇ e oddeˇlovac ˇ musı ´ by ´ t bezprostrˇedne ˇ na´sledova ´ n znakem nove´ho r ˇ a´dku.
print <<KONEC; # spra´vne ˇ
text
KONEC
print <<KONEC # spra´vne ˇ
text
KONEC ;
print <<KONEC # s ˇpatne ˇ text
KONEC;
Koncovy ´ oddeˇlovac ˇ textu, ktery ´ nenı ´ uveden v uvozovka´ch, apostrofech nebo obra ´ ceny ´ ch apostrofech, musı ´ na´sledovat bezprostrˇedne ˇ za symbolem <<. Nenı´-li tomu tak, za koncovy ´ oddeˇlovac ˇ bude povaz ˇ ova ´ n pra´zdny ´ znak, coz ˇ znamena ´ , z ˇ e text bude koncˇit prvnı´m r ˇ a´dkem, na ktere ´ m bude pouze znak konce r ˇ a´dku. Prˇi zapnuty ´ ch varova ´nı´ch je na toto upozorne ˇ no.
print << KONEC # chyba
prvnı ´ r ˇa´dek textu druhy ´ r ˇa´dek textu
KONEC
print << prvnı ´ r ˇa´dek textu druhy ´ r ˇa´dek textu
# ˆˆˆ tady konc ˇ ı ´ cely ´ r ˇeteˇzec
R ˇ ete ˇ zce vytvor ˇ ene ´ tı´mto zpu ˚ sobem mohou norma´lne ˇ figurovat jako souc ˇ a´st vy ´razu ˚
print uc <<KONEC, 1 x 5;
prvnı ´ r ˇa´dek textu
druhy r ˇa´dek textu
KONEC
# vytiskne
PRVNI ´ RA ´ DEK TEXTU
DRUHY ´ R ˇ A ´ DEK TEXTU 11111
@cisla = ($cisla = <<KONEC) =˜ /\d+/gm; 5 12
3 8
7
KONEC
print join ’, ’,@cisla; # vytiskne ’5, 12, 3, 8, 7’
R ˇ ete ˇ zce vznikle ´ z vı´cer ˇ a´dkove´ho textu se mohou skla´dat za sebe.
print <<PRVNI, ”123\n” , <<DRUHY x 3; abc
PRVNI xyz
DRUHY
# vytiskne abc 123 xyz xyz xyz
Automaticke ´ konverze mezi r ˇeteˇzci a c ˇ ı ´sly
Pokud se c ˇ ı ´selna ´ hodnota pouzˇije jako r ˇete ˇ zec, automaticky se tato hodnota pr ˇ evede na r ˇete ˇ zec, ktery ´ obsahuje za´pis pr ˇ ı ´slus ˇ ne´ho c ˇ ı ´sla. V opac ˇ ne ´ m pr ˇ ı ´pade ˇ interpret prˇeskoc ˇ ı ´ poc ˇ a´tec ˇ nı ´ bı´le ´ znaky (mezery, tabula´tory, konce r ˇ a´dku ˚ ), vezme nejdels ˇ ı ´ souvislou c ˇ a´st r ˇete ˇ zce prˇedstavujı´cı ´ platny ´ za´pis c ˇ ı ´sla a zbytek r ˇete ˇ zce ignoruje. Pokud r ˇete ˇ zec nezac ˇ ı ´na ´ za´pisem c ˇ ı ´sla, je vyhodnocen jako hodnota 0.
print ’a’.123; # vytiskne ’a123’ print ’12a’ + 3; # vytiskne ’15’ (12+3)
print ’-1.2e2abc’ * ’2’; # vytiskne ’-240’ (-120*2)
print ’abc’>>3; # vytiskne ’0’ (0>>3)
Pozor, Perl nerozpozna ´ va ´ c ˇ ı ´sla zadane ´ hexadecima´lne ˇ nebo oktalove ˇ , na prˇevod je trˇeba volat funkce hex nebo oct. Rovne ˇ z ˇ pr ˇ ı ´padna ´ podtrz ˇ ı ´tka nejsou cha ´ pa ´ na tak, jako prˇi za´pisu c ˇ ı ´selne´ho litera´lu.
print 2 * ’0xf’; # vytiskne ’0’ (2*0)
print 2 * hex ’0xf’; # vytiskne ’30’ (2*15)
Funkce pracujı ´ cı ´ se skala ´ ry
Pro pra´ci se skala ´rnı´mi hodnotami existuje r ˇada vestave ˇ ny ´ ch funkcı ´ (jejich seznam je moz ˇ ny ´ najı´t v kapitole 10. Standardnı´ funkce). Navı´c se neˇktere ´ dals ˇ ı ´ funkce, ktere ´ mohou by ´ t uzˇitec ˇ ne ´ pro pra´ci se skala ´rnı´mi hodnotami, ale nepatr ˇ ı ´ zatı´m mezi standardnı ´ funkce, nacha´zejı ´ ve standardnı´m modulu Scalar::Util.
Hola ´ slova
Je-li neˇkde v programu pouzˇito slovo, ktere ´ nema ´ z ˇ a´dny ´ vy ´ znam (nenı ´ to funkce, na ´ve ˇ sˇtı ´ ani na ´ zev ovladac ˇ e souboru apod.), je automaticky povaz ˇ ova ´ no za r ˇete ˇ zec. Tyto r ˇete ˇ zce jsou oznac ˇ ova ´ ny jako hola ´ slova (anglicky barewords). Mohou by ´ t nebezpec ˇ na ´ v tom, z ˇ e v budoucı´ch verzı´ch Perlu by mohla prˇiby ´ t takova´to rezervovana ´ slova. Prˇi zapnuty ´ ch varova ´nı´ch je na ne ˇ upozorne ˇ no, ale nejsou chybou. Je-li zaveden pragmaticky ´ modul strict (striktnı ´ rezˇim) s parametrem ’subs’, jsou povaz ˇ ova ´ na za chybu jiz ˇ prˇi kompilaci.
Hola ´ slova nepodle´hajı ´ vkla´da ´ nı ´ a nemohou obsahovat neˇktere ´ znaky jako r ˇete ˇ zce s ohranic ˇovacı´my symboly.
abc-xyz; # pouzˇitı ´ nec ˇ ı ´selny´ch hodnot prˇi odec ˇ ı ´ta´nı ´
$x = 1; abc${x}yz; # chyba, nelze prove´st vkla´da´nı ´
4.2 Pole a seznamy
V na´sledujı´cı ´ podkapitole se sezna ´mı´me s prvnı´m ze dvou seznamovy ´ ch datovy ´ ch typu ˚ . Nejprve je ale trˇeba definovat dva pojmy seznam a pole. Zatı´mco seznam je pouze uspor ˇ a´dana ´ posloupnost skala ´ ru ˚ , pole je prome ˇ nna ´ obsahujı´cı ´ seznamovou hodnotu. Je-li neˇkde vyzˇadova ´ na seznamova ´ hodnota, je tam moz ˇ ne ´ pouz ˇ ı ´t pole i seznam. Pouze v pr ˇ ı ´pade ˇ , z ˇ e je vyzˇadova ´ no pr ˇ ı ´mo pole (napr ˇ ı ´klad u funkcı´, ktere ´ modifikujı ´ pole), za ´ me ˇ nu prove´st moz ˇ ne ´ nenı´.
K jednotlivy ´ m prvku ˚ m seznamu cˇi pole lze prˇistupovat pomocı ´ cˇı´selny´ch indexu ˚ . Mu ˚ z ˇ eme r ˇ ı ´ci, z ˇ e c ˇ ı ´selne ´ indexy zac ˇ ı ´najı ´ od nuly a nenı ´ moz ˇ ne ´ stanovit si vlastnı ´ rozsah pole jako napr ˇ ı ´klad v Pascalu. Ve skutecˇnosti je vzˇdy indexem prvnı´ho prvku pole hodnota, kterou obsahuje prome ˇ nna ´ $[∗ a ta je implicitne ˇ 0. Pokud tuto hodnotu zme ˇnı´me, zme ˇ nı ´ se i indexova ´ nı ´ prvku ˚ pole. Nenı ´ to vsˇak doporuc ˇ ova ´ no, protoz ˇ e na te´to vlastnosti mu ˚ z ˇ e za´viset r ˇada dals ˇ ı ´ch ve ˇcı´.
Prvkem pole mu ˚ z ˇ e by ´ t pouze skala ´ rnı ´ hodnota (c ˇ ı ´slo, r ˇete ˇ zec nebo odkaz) a kazˇdy ´ z teˇchto prvku ˚ ma ´ pr ˇ esne ˇ dane ´ porˇadı ´ (je oznac ˇ eno indexem). Nejmens ˇ ı ´ pole neobsahuje z ˇ a´dne ´ hodnoty a nazy ´ va ´ se pra´zdne ´ pole (takovy ´ litera´l se oznacˇuje ()), nejveˇts ˇ ı ´ pole zaplnı ´ celou pameˇt’ Nikde se prˇedem nedefinuje de´lka pole, ani nenı ´ trˇeba alokovat pro prvky v poli pameˇt’ De´lka pole, a tı´m i velikost pole v pameˇti, se dynamicky me ˇ nı ´ podle toho, jak prvky do pole prˇida ´ va ´ me cˇi odebı´ra ´ me.
Seznamove ´ litera´ly
Prvky seznamove´ho litera´lu mohou by ´ t vy ´ razy vracejı´cı ´ jak skala ´rnı´, tak i seznamove ´ hodnoty Jednotlive ´ hodnoty jsou oddeˇleny opera´torem c ˇ a´rka. Cely ´ litera´l se v pr ˇ ı ´pade ˇ nutnosti ohranicˇuje kulaty ´ mi za´vorkami. Tato nutnost je da ´ na preferencemi opera´toru ˚ ve vy ´ razu, kde je seznamovy ´ litera´l pouzˇit.
@pole = (1, 2, ’abc’, @a, funkce()); # za´vorky nutne´, bez nich to same ´ jako # (@pole = 1), 2, ’abc’, @a, funkce(); # opera´tor = ma ´ vysˇsˇı ´ preferenci nez opera´tor ca´rka
print 1, 2, ’abc’, @a, funkce(); # za´vorky nejsou nutne´, jejich pouzˇitı ´ nenı ´ chyba # to same ´ jako print (1, 2, ’abc’, @a, funkce()) # opera´tor ca´rka ma ´ veˇtsˇı ´ prioritu nez print
Na konci seznamove´ho litera´lu mu ˚ z ˇ e by ´ t umı´ste ˇ na c ˇ a´rka, ktera ´ nenı ´ na´sledova ´ na z ˇ a´dnou hodnotou. Nenı ´ to chyba, je to vhodne ´ v pr ˇ ı ´pade ˇ , z ˇ e v budoucnu budeme do litera´lu prˇida´vat dals ˇ ı ´ prvky
@pole = (1,2,3,); # oba litera´ly majı pouze print 1,2,3,; # trˇi hodnoty
V pr ˇ ı ´pade ˇ , z ˇ e seznamovy ´ litera´l obsahuje jednoslovne ´ r ˇete ˇ zce (rˇete ˇ zce neobsahujı´cı ´ bı´le ´ znaky), je moz ˇ ne ´ takovy ´ seznam vytvorˇit pomocı ´ opera´toru qw † Opera´tor
∗ Znak [ ve jme ´ nu prome ˇ nne ´ $[ ma ´ zna ´ zorn ˇ ovat pr ˇ ı ´slusˇnost k polı´m v tom smyslu, z ˇ e indexy polı ´ se zapisujı do hranatych zavorek.
†Z te´to kapitoly uz vı´me, ze pro ohranicenı ´ argumentu opera ´ toru qw mu ˚ zeme zvolit libovolny ´ znak (krome ˇ bı´ly ´ ch znaku ˚ ) nebo dvojici za ´ vorek.
qw je zkratkou ze slov „quote words“ a provede to, z ˇ e ze sve´ho argumentu odstranı ´ bı´le ´ znaky a vra´tı ´ seznam sloz ˇ eny ´ z takto vznikly ´ ch c ˇ a´stı ´ (jsou cha ´ pa ´ ny jako r ˇete ˇ zce v apostrofech).
@pole = qw(aaa bbb ccc ddd); # nebo
@pole = qw( aaa bbb ccc ddd ); # @pole obsahuje hodnoty (’aaa’,’bbb’,’ccc’,’ddd’)
Jestliz ˇ e se v seznamove ´ m litera´lu objevı ´ opera´tor konstruktoru seznamu (..), automaticky se vytvor ˇ ı ´ seznam zac ˇ ı ´najı´cı ´ hodnotou na leve ´ strane ˇ a konc ˇ ı ´cı ´ hodnotou na prave ´ strane ˇ tohoto opera´toru. Inkrementace se prova´dı ´ o hodnotu jedna a probı´ha ´ pro c ˇ ı ´sla i pro r ˇete ˇ zce. Veˇts ˇ ı ´ prostor je tomuto opera´toru ve ˇ nova ´ n v kapitole 6. Opera´tory.
(1 .. 5); # to stejne ´ jako (1, 2, 3, 4, 5) (1.1 .. 5.1); # to stejne ´ jako (1, 2, 3, 4, 5) (1 .. 5, 10, 15); # to stejne ´ jako (1, 2, 3, 4, 5, 10, 15) (’a’ ’z’); # seznam obsahujı´cı ´ vsˇechna mala ´ pı´smena ($x .. $y); # za´lezˇı ´ na hodnota´ch promeˇnny´ch $x a $y
De´lka pole
Pocˇet prvku ˚ v poli (tzv. de´lku pole) je moz ˇ ne ´ zı´skat vyhodnocenı´m prome ˇ nne ´ ve skala ´rnı´m kontextu. Explicitne ˇ je toho moz ˇ ne ´ dosa´hnout s vyuzˇitı´m funkce scalar jako scalar @pole. Stejny ´ vy ´ sledek zı´ska ´ me i v jinak vznikle ´ m skala ´rnı´m kontextu.
Index poslednı´ho prvku pole je obsaz ˇ en v prome ˇ nne ´ $#pole (pokud indexy pole c ˇ ı ´slujeme od nuly, je tato hodnota o jedna mens ˇ ı ´, nez ˇ velikost pole). Prˇir ˇazenı´m do te´to prome ˇ nne ´ se me ˇ nı ´ velikost pole. Je-li prˇir ˇ azovana ´ hodnota veˇts ˇ ı ´ nez ˇ de´lka pole, je pocˇet prvku ˚ zvy ´ s ˇ en (doplne ˇ ne ´ prvky budou obsahovat nedefinovanou hodnotu). Je-li prˇir ˇ azovana ´ hodnota mens ˇ ı ´ nez ˇ de´lka pole, je pole zkra ´ ceno a prˇebytec ˇ ne ´ prvky ztraceny. Zkra´tit pole na nulovou de´lku je tedy moz ˇ ne ´ na´sledujı´cı´mi zpu ˚ soby.
@pole = (); $#pole = -1;
Uvolnit pameˇt’zabranou polem je moz ˇ ne ´ pomocı ´ undef @pole. Pouhe ´ zkra ´ cenı ´ pole na nulovou de´lku toto neucˇinı´.
Vyhodnocova ´ nı ´ polı ´ a seznamovy´ch litera´lu ˚ v ru ˚ zne ´ m kontextu
V seznamovy ´ ch litera´lech jsou seznamove ´ hodnoty oddeˇleny c ˇ a´rkami. Kdyz ˇ je to vyzˇadova ´ no, je tento seznam hodnot oddeˇlen od zbytku textu kulaty ´ mi za´vorkami. Ty slouz ˇ ı ´ k tomu, aby bylo jasne ´ , kde seznam zac ˇ ı ´na ´ a konc ˇ ı ´. V seznamove ´ m kontextu je hodnotou seznamove´ho litera´lu posloupnost vsˇech prvku ˚ seznamu v dane ´ m porˇadı´. Ve skala ´rnı´m kontextu je hodnotou seznamove´ho litera´lu poslednı ´ prvek seznamu.
@pole = (’a’, ’b’, ’c’);
Seznam @pole obsahuje trˇi hodnoty v porˇadı ´ tak, jak je zada ´ no v kulaty ´ ch za ´vorka´ch.
$prvek = (’a’, ’b’, ’c’);
Takto je seznamovy ´ litera´l vyhodnocen ve skala ´rnı´m kontextu. Prome ˇ nna ´ $prvek tedy obsahuje hodnotu c, coz ˇ je poslednı ´ hodnota seznamove´ho litera´lu na prave ´ strane ˇ
Na druhou stranu je trˇeba odlisˇit pr ˇ ı ´pad, kdy ve skala ´rnı´m kontextu vyhodnocujeme prome ˇ nnou typu pole. Tehdy je vy ´ sledkem takove´ho vy ´ razu nikoliv poslednı ´ prvek pole, ale jeho de´lka.
@pole = (’a’, ’b’, ’c’);
$pocet = @pole; # v obou prˇı´padech promeˇnna ´ $pocet $pocet = scalar @pole; # obsahuje pocet prvku ˚ pole
Pole i seznamy mohou obsahovat libovolne ´ vy ´ razy vracejı´cı ´ hodnotu. Hodnoty mohou by ´ t skala ´ rnı ´ (rˇete ˇ zce, c ˇ ı ´sla, odkazy) nebo seznamove ´ . Obsahuje-li seznamovy ´ litera´l seznamovou hodnotu nebo prome ˇ nnou, dojde postupne ˇ ke vloz ˇ enı ´ vsˇech prvku ˚ teˇchto struktur do seznamu (dojde k jejich vyhodnocenı ´ v seznamove ´ m kontextu). Seznamove ´ prome ˇ nne ´ tak ztra´cejı ´ svoji identitu. Pra´zdne ´ seznamy jsou ignorova ´ ny.
@pole1 = (1, 2, 3); @pole2 = (’a’, ’b’, @pole1, ’c’)’ # @pole2 obsahuje prvky ’a’, ’b’, 1, 2, 3, ’c’
Ve skutecˇnosti jsou vsˇechny prvky v seznamu vyhodnocova ´ ny v seznamove ´ m kontextu pouze v tom pr ˇ ı ´pade ˇ , z ˇ e se cely ´ seznam vyhodnocuje v seznamove ´ m kontextu. Je-li cely ´ seznam vyhodnocova ´ n ve skala ´rnı´m kontextu, jsou jeho jednotlive ´ prvky vyhodnoceny ve skala ´rnı´m kontextu.
@a = (’a’, ’b’, ’c’);
@x = (1, 2, 3, @a); # @x obsajuje 1, 2, 3, ’a’, ’b’, ’c’, pole @a # bylo vyhodnoceno v seznamove´m kontextu
$x = (1, 2, 3, @a); # $x obsahuje 3, coz ˇ je de´lka pole @a, # ktere bylo vyhodnoceno ve skala´rnı´m kontextu
Pr ˇ ı ´stup k prvku ˚ m seznamu
Pro pr ˇ ı ´stup k jednotlivy ´ m prvku ˚ m pole se pouz ˇ ı ´vajı ´ indexy Indexy jsou c ˇ ı ´selne ´ hodnoty zac ˇ ı ´najı´cı ´ od hodnoty prome ˇ nne ´ $[ (implicitne ˇ 0) a zada´vajı ´ se do hranaty ´ ch za ´vorek za jme ´ no prome ˇ nne ´ typu pole.
Jednotlive ´ hodnoty pole jsou skala ´ rnı ´ hodnoty, jejich oznac ˇ enı ´ tedy nenı ´ uvozeno znakem @, ale znakem $ Prome ˇ nna ´ $pole[0] je prvnı´m prvkem pole @pole, prome ˇ nna ´ $pole[1] druhy ´ m atd. a prome ˇ nna ´ $pole[$#pole] poslednı´m.
K prvku ˚ m pole je moz ˇ ne ´ prˇistupovat i od konce. K tomu se pouz ˇ ı ´vajı ´ za ´ porne ´ indexy. $pole[-1] tedy znamena ´ prvnı ´ prvek pole od konce, neboli poslednı ´ prvek tohoto pole, $pole[-2] prvek prˇedposlednı ´ atd.
Neza´lez ˇ ı ´ na tom, zda prˇistupujeme k prvku ˚ m pole nebo k prvku ˚ m seznamove´ho litera´lu, v obou pr ˇ ı ´padech se pouz ˇ ı ´vajı ´ hranate ´ za´vorky a c ˇ ı ´selne ´ indexy.
$pole[1] = ’abc’; # nastavenı prvku pole print $pole[1]; # zjisˇteˇnı ´ hodnoty prvku pole
$x = (1, 2, 3)[2]; # $x obsahuje hodnotu 3 $rok = 1900 + (localtime)[5]; # spra´vneˇ, musı ´ by´t pouzˇity za´vorky $rok = 1900 + localtime[5]; # chybı ´ za´vorky
C ˇ ı ´selne ´ indexy samozrˇejme ˇ nemusejı ´ by ´ t pouze konstanty, ale i vy ´ razy vracejı´cı ´ hodnotu. Tyto vy ´ razy zadane ´ v hranaty ´ ch za´vorka´ch jsou vyhodnocova ´ ny vzˇdy ve skala ´rnı´m kontextu a hodnota je bra ´ na jako c ˇ ı ´slo. Je-li to hodnota r ˇete ˇ zcova ´ , prˇevede se nejprve na hodnotu c ˇ ı ´selnou.
@pole = (1,2,3);
$x = 1;
$pole[$x] = ’x’ # prˇirˇazenı ´ do $pole[1]
$pole[@pole] = ’4’; # prˇirˇazenı ´ do $pole[3]
$pole[’2abc’] = 3; # prˇirˇazenı ´ do $pole[2]
$pole[’abc’] = ’y’; # prˇirˇazenı ´ do $pole[0]
$pole[undef] = ’z’; # prˇirˇazenı ´ do $pole[0]
Rozsah polı ´ nenı ´ kontrolova ´ n, protoz ˇ e nenı ´ prˇedem da ´ n. Pokous ˇ ı ´me-li se modifikovat prvek pole, ktery ´ neexistuje, tento prvek se vytvor ˇ ı ´ a pr ˇ ı ´padna ´ mezera mezi
poslednı´m prvkem pu ˚ vodnı´ho pole a tı´mto novy ´ m prvkem je vyplne ˇ na nedefinovany ´ mi hodnotami. Jediny ´ m proble ´ mem je prˇir ˇ azenı ´ do prvku, jehoz ˇ index je mens ˇ ı ´ nez ˇ 0. Jiny ´ mi slovy, kdyz ˇ se pokous ˇ ı ´me modifikovat prvek, ktery ´ je od konce pole vzda´len vı´ce nez ˇ je de´lka pole.
Pra ´ ce s vı ´ ce prvky seznamu nebo pole najednou
Perl umoz ˇ n ˇ uje pracovat s jednotlivy ´ mi prvky pole, s jeho c ˇ a´stı ´ i s polem jako s celkem. Jediny ´ m prˇir ˇazovacı´m pr ˇ ı ´kazem lze jedno pole nebo seznam zkopı´rovat do jine´ho (prvky seznamu musejı ´ by ´ t v takove ´ m pr ˇ ı ´pade ˇ modifikovatelne ´ , tzn. obsahujı ´ prome ˇ nne ´ cˇi jine ´ l-hodnoty). Prˇir ˇ azova ´ nı ´ probı´ha ´ tak, z ˇ e si jsou prˇir ˇ azova ´ ny prvky na odpovı´dajı´cı´ch si pozicı´ch.
($x, $y, $z) = (1, 2, 3);
($x, $y, $z) = (1, 2); ($x, $y) = (1, 2, 3);
V prvnı´m pr ˇ ı ´pade ˇ majı ´ vsˇechny trˇi prome ˇ nne ´ hodnoty 1, 2 a 3. Ve druhe ´ m pr ˇ ı ´pade ˇ se provede prˇir ˇ azenı ´ pouze do prome ˇ nny ´ ch $x a $y. Do prome ˇ nne ´ $z bude uloz ˇ ena nedefinovana ´ hodnota, protoz ˇ e nebyla nalezena odpovı´dajı´cı ´ hodnota v seznamu na prave ´ strane ˇ prˇir ˇazenı´. V poslednı´m pr ˇ ı ´pade ˇ budou nastaveny obe ˇ prome ˇ nne ´ a hodnota 3 bude zapomenuta. Nebylo pro ni totiz ˇ nalezeno mı´sto na leve ´ strane ˇ prˇir ˇazenı´.
@pole1 = @pole2;
Tı´mto pr ˇ ı ´kazem se provede zkopı´rova ´ nı ´ vsˇech prvku ˚ z prvnı´ho pole do druhe´ho. Obe ˇ pole potom majı ´ stejnou i de´lku. Bylo-li prvnı ´ pole prˇed prˇir ˇazenı´m dels ˇ ı ´, prˇebytec ˇ ne ´ prvky jsou zapomenuty. Bylo-li krats ˇ ı ´, je jeho de´lka zveˇts ˇ ena.
Nepotrˇebujeme-li neˇktere ´ hodnoty ulozˇit, mu ˚ z ˇ eme na leve ´ strane ˇ prˇir ˇ azenı ´ na tomto mı´ste ˇ uve´st undef.
(undef, undef, undef, $den, $mesic, $rok) = localtime(time); # funkce localtime vracı ´ seznam devı´ti hodnot, na´s z nich # zajı´ma ´ pouze aktua´lnı ´ datum (den, meˇsı´c a rok na ctvrte ´ # az s ˇeste ´ pozici)
Je-li na leve ´ strane ˇ prˇir ˇ azenı ´ seznamova ´ prome ˇ nna ´ , jsou do te´to prome ˇ nne ´ uloz ˇ eny vsˇechny zby ´ vajı´cı ´ hodnoty na strane ˇ prave ´ .
($x, $y, @zbytek) = (1, 2, 3, 4, 5); # $x obsahuje 1, $y obsahuje 2 a @zbytek obsahuje (3, 4, 5)
($x, @zbytek, $y) = (1, 2, 3, 4, 5); # $x obsahuje 1, @zbytek obsahuje (2, 3, 4, 5), # $y obsahuje nedefinovanou hodnotu
Prˇir ˇazenı´m do pole cˇi seznamu vznika ´ na prave ´ strane ˇ prˇir ˇazovacı´ho opera´toru seznamovy ´ kontext, cˇehoz ˇ je moz ˇ ne ´ vyuz ˇ ı ´t k nepr ˇ ı ´me ´ mu vynucenı ´ seznamove´ho kontextu.
@pole = qw(a b c);
$x = (1, 2, @pole); # litera´l vyhodnocen ve skala´rnı´m # kontextu, $x obsahuje 3
$x = @x = ( 1, 2, @pole); # litera´l vyhodnocen v seznamove´m # kontextu, $x obsahuje 5 (de´lka @x)
$x = (@x) = ( 1, 2, @pole); # to same ´
$x = () = ( 1, 2, @pole); # to same´, hodnoty zapomenuty
Hodnota prˇir ˇ azenı ´ seznamu je pocˇet prvku ˚ na prave ´ strane ˇ tohoto prˇir ˇazenı´, proto v poslednı´ch trˇech pr ˇ ı ´padech byla hodnota prome ˇ nne ´ $x vzˇdy 5. Byla to totiz ˇ de´lka seznamove´ho litera´lu na prave ´ strane ˇ a pocˇet skutec ˇ ne ˇ prˇir ˇ azeny ´ ch hodnot se nebral v u ´ vahu.
Tohoto je moz ˇ ne ´ vyuz ˇ ı ´t v logicke ´ m kontextu, kdy se testuje na´vratova ´ hodnota funkce vracejı´cı ´ seznam. Vy ´ raz bude nepravdivy´, kdyz ˇ funkce vra´tı ´ pra´zdny ´ seznam, jinak bude pravdivy´. Vra´tı´-li funkce hodnotu 0, je ve skala ´rnı´m kontextu nepravdiva ´ , ale v seznamove ´ m kontextu je to jednoprvkovy ´ seznam.
while (($hodnota) = dej_hodnotu ) { print $hodnota; }
Kdybychom napsali pouze $hodnota = dej_hodnotu, cely ´ vy ´ raz by byl nepravdivy ´ v pr ˇ ı ´pade ˇ , z ˇ e by funkce vra´tila neˇkterou z nepravdivy ´ ch hodnot (hodnotu 0, ”” , ”0” cˇi undef).
Prˇir ˇazenı´m do seznamu je moz ˇ ne ´ vynutit vola ´ nı ´ funkce v seznamove ´ m kontextu.
funkce; # vyhodnocenı funkce v pra´zdne´m kontextu, # coz ˇ je prˇı´pad skala´rnı´ho kontextu (@x) = funkce; # vola´nı funkce v seznamove´m kontextu () = funkce; # to same´, na´vratove ´ hodnoty zapomenuty
U ´ seky polı ´
S neˇkolika prvky pole souc ˇ asne ˇ lze pracovat jako s tzv. u ´ seky na´sledujı´cı´mi zpu ˚ soby:
($den, $mesic, $rok) = (localtime)[3, 4, 5];
@pole[5..7] = (5, 6, 7); foreach (@pole[5..10]) { print };
Za´pis u ´ seku pole vypada ´ jako za´pis prvku pole, ale na zac ˇ a´tku je symbol @.
Nejedna ´ se totiz ˇ o skala ´ rnı ´ hodnotu, ale o seznamovou hodnotu. S u ´ seky polı ´ se pracuje stejne ˇ , jako by to byla norma´lnı ´ pole. Napı´sˇeme-li @pole[1] (jednoprvkovy ´ seznam) a mysleli jsme tı´m $pole[1], neudeˇla ´ me velkou chybu. Pouze pokud bychom provedli tuto za ´ me ˇ nu na leve ´ strane ˇ prˇir ˇazovacı´ho pr ˇ ı ´kazu, rozdı´l bude v tom, z ˇ e v prvnı´m pr ˇ ı ´pade ˇ se prava ´ strana vyhodnotı ´ ve skala ´rnı´m kontextu, zatı´mco ve druhe ´ m pr ˇ ı ´pade ˇ v kontextu seznamove ´ m.
@pole = (1,2,3);
$pole[1] = @pole; # prˇirˇadı ´ se de´lka @pole @pole[1] = @pole; # prˇirˇadı ´ se prvnı ´ prvek @pole
Funkce pro pra´ci s poli
Pro pra´ci se seznamy, poli a jejich prvky je v Perlu prˇeddefinova ´ na r ˇada funkcı´. Pomocı ´ funkce push je moz ˇ ne ´ na konec zadane´ho pole prˇidat zadany ´ seznam prvku ˚ Pomocı ´ funkce unshift je moz ˇ ne ´ prova´deˇt to same ´ , ale prvky budou prˇida ´ ny na zac ˇ a´tek. De´lka pole se o dany ´ pocˇet prvku ˚ zvy ´ s ˇ ı ´ a je vra ´ cena jako na´vratova ´ hodnota teˇchto funkcı´.
@pole = (1, 2, 3);
print push @pole, 10; # vytiskne 4
# @pole obsahuje 1, 2, 3, 10
print unshift @pole, 20; # vytiskne 5
# @pole obsahuje 20, 1, 2, 3, 10
Pro odebra ´ nı ´ jednoho prvku z pole slouz ˇ ı ´ funkce pop, ktera ´ odebere a vra´tı ´ prvek z konce pole, a funkce shift, ktera ´ odebere a vra´tı ´ prvek pole ze zac ˇ a´tku. V obou pr ˇ ı ´padech se tak de´lka pole zkra´tı ´ o jeden prvek.
@pole = (1, 2, 3, 4, 5);
print pop @pole; # vytiskne 5, # @pole obsahuje 1, 2, 3, 4
print shift @pole; # vytiskne 1, # @pole obsahuje 2, 3, 4
Dı´ky existenci teˇchto funkcı ´ a vlastnostem polı ´ v Perlu lze bez velke ´ na´mahy implementovat datove ´ struktury fronta a za´sobnı´k. Dvojice funkcı ´ push a pop nebo
unshift a shift slouz ˇ ı ´ pro pra´ci s polem jako se za´sobnı´kem, dvojice push a shift nebo unshift a pop umoz ˇ n ˇ ujı ´ s polem pracovat jako s frontou.
Funkce splice umı ´ pracovat s vı´ce prvky pole najednou a tyto prvky se nemusejı ´ nutne ˇ nacha´zet pouze na zac ˇ a´tku nebo na konci pole. Funkce ze zadane´ho pole vezme zadany ´ pocˇet prvku ˚ na zadane ´ pozici a nahradı ´ je zadany ´ m seznamem hodnot. Jsouli hodnoty uda´vajı´cı ´ pocˇet prvku ˚ , ktere ´ se majı ´ nahradit, nebo pocˇet prvku ˚ , ktere ´ se majı ´ vlozˇit, nulove ´ , docha ´ zı ´ pouze k vloz ˇ enı ´ cˇi odebra ´ nı ´ prvku ˚ z pole.
@pole = (1, 2, 3, 4, 5);
splice @pole, 2, 2, ’a’, ’b’, ’c’; # z pole @pole odebereme dva prvky (3 a 4) od indexu 2
# a vlozˇı´me hodnoty ’a’, ’b’, ’c’. Pole obsahuje
# hodnoty 1, 2, ’a’, ’b’, ’c’, 5
splice @pole, 3, 1;
# z pole @pole odebereme od indexu 3 jeden prvek (’b’)
# a nicı´m nenahrazujeme. Pole obsahuje
# hodnoty 1, 2, ’a’, ’c’, 5
splice @pole, 1, 0, ’x’, ’y’;
# z pole @pole od indexu 1 odstranı´me 0 prvku # a vlozˇı´me prvky ’x’ a ’y’. Pole obsahuje # hodnoty 1, ’x’, ’y’, 2, ’a’, ’c’, 5
Pomocı ´ funkce splice je moz ˇ ne ´ s polem pracovat jako s linea ´ rne ˇ zrˇete ˇ zeny ´ m seznamem.
Pokud chceme serˇadit vsˇechny prvky pole, nemusı´me vymy ´ sˇlet vlastnı ´ algoritmus (nebo sami implementovat algoritmus jiz ˇ vymysˇleny ´ ), ale stac ˇ ı ´ pouze pouz ˇ ı ´t vestave ˇ nou funkci sort. Ta jako argument ocˇeka ´ va ´ seznamovou hodnotu a vracı ´ novy ´ seznam, kde jsou vsˇechny pu ˚ vodnı ´ prvky ser ˇ azeny podle abecedy vzestupne ˇ . Dı´ky tomu, z ˇ e tato funkce umoz ˇ n ˇ uje prˇedefinovat implicitnı ´ zpu ˚ sob r ˇazenı´, je moz ˇ ne ´ implementovat i r ˇ azenı ´ sestupne ´ , c ˇ ı ´selne ´ a dokonce i vı´cekriteria´lnı´. Podrobnosti lze nale´zt v kapitole 10. Standardnı´ funkce u popisu funkce sort. Pro postupne ´ zpracova ´ nı ´ prvku ˚ pole se velmi cˇasto pouz ˇ ı ´va ´ cyklus foreach (je moz ˇ ne ´ pouz ˇ ı ´t i zkra ´ ceny ´ za´pis for). Ten v jednotlivy ´ ch iteracı´ch postupne ˇ nastavuje r ˇ ı ´dicı ´ prome ˇ nnou cyklu na jednotlive ´ prvky zadane´ho seznamu a prova´dı ´ vlastnı ´ teˇlo cyklu. Pokud nenı ´ jme ´ no r ˇ ı ´dı´cı ´ prome ˇ nne ´ zada ´ no, implicitne ˇ se pouzˇije prome ˇ nna ´ $_. foreach (@pole) { zpracuj_hodnotu($_); }
for $x (1..10) {
print ”$x * $x = ”, $x*$x, ”\n”; }
Prvky seznamu v opac ˇ ne ´ m porˇadı ´ vracı ´ funkce reverse.
Pokud ma ´ me r ˇete ˇ zec a chceme ho rozdeˇlit na c ˇ a´sti podle neˇjake´ho vzoru, mu ˚z ˇ eme pouz ˇ ı ´t funkcı ´ split Jako argumenty jı ´ zada ´ me vzor, podle ktere´ho ma ´ dojı´t k rozdeˇlenı ´ r ˇete ˇ zce, a vlastnı ´ r ˇete ˇ zec.
$radek = <>; # na r ˇa´dku prˇedpokla´da´me jme´no, prˇı´jmenı # a telefonnı cı´slo oddeˇlene mezerou ($jmeno, $prijmeni, $telefon) = split ’ ’, $radek;
Opac ˇ ny ´ proces prova´dı ´ funkce join Ta jako argument ocˇeka ´ va ´ r ˇete ˇ zec, ktery ´ m spojı ´ prvky seznamu tvor ˇ ı ´cı ´ zbytek argumentu ˚ .
print join ’, ’, @hodnoty; # spojı ´ hodnoty c ˇ a ´rkou a vytiskne
Pro zjisˇte ˇnı´, zda pole obsahuje urcˇitou hodnotu mu ˚ z ˇ eme pouz ˇ ı ´t funkci grep.
if (grep {$_ < 0} @pole) { print ’Pole obsahuje alespon ˇ jedno za´porne ´ c ˇ ı ´slo.’ }
Pro zı´ska ´ nı ´ pole, u neˇhoz ˇ jsou polozˇky modifikova ´ ny zadany ´ m zpu ˚ sobem, slouz ˇ ı ´ funkce map.
@slova_velkymi_pismemy = map {uc} @slova;
Neˇktere ´ dals ˇ ı ´ funkce, ktere ´ mohou by ´ t uzˇitec ˇ ne ´ pro pra´ci s poli a seznamy, ale nepatr ˇ ı ´ zatı´m mezi standardnı ´ funkce, jsou definova ´ ny ve standardnı´m modulu
List::Util.
4.3 Hashe (asociativnı ´ pole)
Hash je seznamova ´ datova ´ struktura, kde se k jednotlivy ´ m prvku ˚ m prˇistupuje pomocı ´ r ˇete ˇ zcovy ´ ch indexu ˚ zvany ´ ch klı´cˇe (hodnoty jsou asociova ´ ny ke klı´c ˇ u ˚ m, odtud na ´ zev asociativnı ´ pole). Vnitr ˇ ne ˇ je hash implementova ´ n pomocı ´ rozpty ´ leny ´ ch tabulek a vyhleda ´ va ´ se v ne ˇ m pomocı ´ mapovacı ´ funkce. Prvky tedy nemajı ´ pr ˇ esne ˇ dane ´ porˇadı´, jako je tomu u polı´, a prˇi postupne ´ m zı´ska ´ va ´ nı ´ hodnot z hashe tyto nebudou pravdeˇpodobne ˇ vraceny pr ˇ esne ˇ v tom porˇadı´, v jake ´ m byly do hashe ukla´da ´ ny.
ˇ
´
Jako klı´c ˇ e hashe se vzˇdy pouz ˇ ı ´vajı ´ r ˇete ˇ zce nebo vy ´ razy vracejı´cı ´ r ˇete ˇ zcovou hodnotu (i pra´zdny ´ r ˇete ˇ zec cˇi r ˇete ˇ zec s bı´ly ´ mi znaky). Klı´c ˇ je v ra´mci jednoho hashe jedinec ˇny´, a nelze tak ulozˇit dve ˇ nebo vı´ce dvojic se stejny ´ m klı´c ˇ em. Prˇi pokusu o prˇir ˇ azenı ´ na jiz ˇ pouzˇitou klı´c ˇ ovou pozici se pr ˇepı´s ˇ e pu ˚ vodnı ´ hodnota hodnotou novou.
Klı´c ˇ e hashe nemohou by ´ t tvor ˇ eny pevny ´ mi odkazy ∗ Prˇi pokusu o pouzˇitı ´ pevne´ho odkazu jako klı´c ˇ e hashe vzˇdy nejprve dojde k prˇevedenı ´ pevne´ho odkazu na r ˇete ˇ zcovou reprezentaci (rˇete ˇ zec je pak ve tvaru SCALAR(0x1ac29f4)) a teprve tento r ˇete ˇ zec se na´sledne ˇ pouzˇije jako klı´c ˇ Zpeˇtna ´ dereference te´to hodnoty nenı ´ moz ˇ na ´ prˇi pokusu o dereferenci takto vznikle ´ hodnoty obdrz ˇ ı ´me varova ´nı´, protoz ˇ e pracujeme s hodnotou, ktera ´ vlastne ˇ nenı ´ odkazem.
Hodnoty hashe jsou skala ´ rnı ´ hodnoty a nemajı ´ z ˇ a´dne ´ omezenı´. Mohou tedy obsahovat c ˇ ı ´sla, r ˇete ˇ zce i pevne ´ odkazy bez jaky ´ chkoliv komplikacı´.
Vytva ´ r ˇ enı ´ hashu ˚ , hashove ´ litera´ly
Hashovy ´ litera´l vypada ´ stejne ˇ jako seznamovy ´ litera´l. Ten by meˇl obsahovat sudy ´ pocˇet prvku ˚ (klı´c ˇ e a hodnoty tvor ˇ ı ´ dvojice). Prvnı ´ hodnota bude bra ´ na jako klı´c ˇ , druha ´ jako hodnota asociovana ´ s tı´mto klı´c ˇ em, dals ˇ ı ´ hodnota opeˇt jako klı´c ˇ atd.
%dny = (’pondeli’, 1 , ’utery’, 2, ’streda’, 3, ’ctvrtek’, 4, ’patek’, 5);
Tı´mto pr ˇ ı ´kazem jsme vytvorˇili hash %dny s peˇti dvojicemi klı´cˇ/hodnota. K r ˇeteˇzci ’pondeli’ je asociova ´ na hodnota 1 atd.
Mı´sto opera´toru c ˇ a´rka lze pouz ˇ ı ´t opera´tor =>, ktery ´ je synonymem, ale prova´dı ´ jednu ve ˇ c navı´c. R ˇ ete ˇ zec, ktery ´ se nacha ´ zı ´ nalevo od tohoto opera´toru, je automaticky povaz ˇ ova ´ n za r ˇete ˇ zec v uvozovka´ch. Usˇetr ˇ ı ´me si tedy neˇjake ´ psanı ´ a navı´c je definice hashe pomocı ´ tohoto opera´toru cˇitelneˇjs ˇ ı ´ a vztah mezi klı´c ˇ em a hodnotou zrˇejmeˇjs ˇ ı ´.
%dny = (pondeli => 1, utery => 2, streda => 3, ctvrtek => 4, patek => 5);
Opera´tor => se vztahuje vzˇdy k bezprostrˇedne ˇ prˇedcha´zejı´cı´mu hole ´ mu slovu, coz ˇ znamena ´ , z ˇ e ma´-li hashovy ´ klı´c ˇ obsahovat neˇjaky ´ znak, jenz ˇ je cha ´ pa ´ n jako oddeˇlovac ˇ slov (mezera, novy ´ r ˇ a´dek) cˇi ma ´ jiny ´ specia´lnı ´ vy ´ znam ($, %, # apod.), musı´me explicitne ˇ uve´st uvozovky nebo apostrofy
∗ Toto omezenı ´ mu ˚ z ˇ eme obejı´t nava ´ za ´ nı´m hashe na balı´k Tie::RefHash