EB967087

Page 1


1.4

6.1

6.3

6.13 Opera´tory rovnosti

6.14 Bitove ´ opera´tory .

6.15 Logicke ´ opera´tory se zkra ´ ceny ´ m vyhodnocenı´m

6.16 Opera´tory rozsahu .

6.17 Podmı´nkovy ´ opera´tor .

6.18 Opera´tor prˇir ˇ azenı ´

6.19 Opera´tor c ˇ a´rka

6.20 Seznamove ´ opera´tory (postupujı´cı ´ vpravo)

6.21 Logicke ´ and, or, not a xor

8.1 Definice forma´tu ˚ a vkla´da ´ nı ´ hodnot .

8.2 Forma´ty a rozsahy platnosti prome ˇ nny ´ ch

8.3 Vy ´ be ˇ r forma´tu a ovladac ˇ e .

8.4 Stra´nkovany ´ vy ´ stup .

9. Podprogramy

9.1 Deklarace a definice podprogramu

9.3 Argumenty funkcı

9.4

11. Odkazy

11.3 Symbolicke ´

12. Sloz

12.1 Za ´ znamy, struktury

12.2 Vı´cerozme ˇ rna ´ pole

12.3 Hashe polı ´

12.4 Pole hashu ˚ , hashe hashu ˚

12.5 Jesˇte ˇ slozˇiteˇjs

12.7 Vy ´ pis datove ´ struktury

13. Balı´ky

Vhnı´zde ˇ

13.3 Autoloading

13.4 Inicializace a opusˇte ˇ nı ´ balı´ku

13.5 Tabulky symbolu ˚ a typegloby

13.6 Rozsahy platnosti a tabulky symbolu ˚ , vymezova ´ nı ´ platnosti

Promenne s omezenou platnostı

Lexika ´ lnı ´ platnost prome ˇ nny ´ ch

Lexikalnı vymezovanı jmen globalnı´ch promennych

14. Moduly

Moduly definujı´cı ´ za ´ kladnı ´ tr ˇ ı ´dy

Chyby a varova ´ nı ´

Moduly pro dokumentacnı podporu

Moduly poskytujı´cı ´ podporu prˇi instalaci modulu

Moduly pro podporu vy ´ voje

Moduly pro podporu generovanı kodu

18.2 Standardnı ´ moduly v abecednı´m porˇadı ´

19. Pragmaticke ´ moduly

19.1 attributes

19.2 attrs

19.3 autouse

19.4 base

19.5 bigint

19.6 bignum

19.7 bigrat

19.8 blib

19.9 bytes

19.10 charnames

19.11 constant

19.12 diagnostics

19.13 encoding

19.14 fields

19.15 filetest

19.16 if

19.17 integer

19.18 less

19.19 lib

19.20 locale

19.21 open

19.23 overload

19.24 re

strict

19.35 warnings::register

Na ´rodnı ´ prostrˇedı ´

Sı´t’ova ´ komunikace

Pr ˇ ı ´klad vytvor ˇ enı ´ dynamicke´ho HTML

Posı´la ´ nı ´ parametru ˚ , pouzˇitı ´ formula ´ r

22.1 U ´ vod do databa ´ zı ´ a databa ´ zovy ´ ch syste ´ mu ˚

22.2 Relac ˇ nı ´ model ba ´ ze dat

Ukla ´ da ´ nı ´ dat pomocı ´ souboru ˚

databaze

Relac ˇ nı ´ databa ´ zove ´ stroje .

Jazyk SQL

Datove ´ typy a obor hodnot

22.3 Modul DBI

22.4 Funkce modulu DBI

22.5 Dynamicke ´ prome ˇ nne ´ DBI

22.6 Atributy spolec ˇ ne ´ pro vsˇechny ovladac ˇ e

22.7 Metody spolec ˇ ne ´ pro vsˇechny objekty ovladac

22.8 Objekty databa ´ zove´ho spojenı ´ 611 Atributy objektu ˚ ovladac ˇ u ˚ databa ´ zove´ho spojenı ´ 611

22.11 Transakce

22.12 Chybove ´ stavy

22.13 Postup prˇi zı´ska ´ va ´ nı ´ nebo modifikaci

24.2 Vyzkous ˇ enı ´ debuggeru v praxi

24.3 Debugger regula ´rnı´ch vy ´ razu ˚

25.1 Prˇehled .

25.2 Tutoria´ly

25.3 Pr ˇ ı ´rucˇky .

25.4 Internı ´ za´lezˇitosti a spolupra ´ ce s jazykem C

25.5 Specificka ´ dokumentace pro neˇktere ´ jazyky

25.6 Informace k distribucı´m Perlu pro ru ˚ zne ´ operac ˇ nı ´ syste ´ my

26. Reference

27. Seznam tabulek

Rejstr ˇ ı ´k

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.

KONTEXT

• Co se rozumı ´ pod pojmem kontext

• Vsˇechny druhy kontextu ˚

• Pravdivost a nepravdivost v Perlu

Pojem kontext je zna ´ m z prˇirozene´ho jazyka. Mu ˚ z ˇ eme ho cha´pat jako okolı ´ urcˇite´ho sdeˇlenı´, jedno sdeˇlenı ´ v ru ˚ zne ´ m kontextu mu ˚ z ˇ e mı´t zcela rozdı´lny ´ vy ´ znam. Stejne ˇ tak kazˇda ´ operace v Perlu ma ´ svu ˚ j kontext vyhodnocuje se v urcˇite ´ m kontextu. Znamena ´ to, z ˇ e na opera´tory i operandy jsou kladeny urcˇite ´ pozˇadavky a ony se potom podle nich chovajı´. Neˇktere ´ opera´tory cˇi vy ´ razy se chovajı ´ sta´le stejne ˇ neza´visle na kontextu, ve ktere ´ m se vyskytujı´, jindy jejich chova ´ nı ´ na kontextu za´visı´. Uveˇdome ˇ nı ´ si, v jake ´ m kontextu se pra ´ ve ˇ nacha ´zı´me, je cˇasto velmi du ˚ lezˇite ´ . Mu ˚z ˇ eme totiz ˇ dosta´vat zda´nlive ˇ chybne ´ vy ´ sledky plynoucı ´ pra ´ ve ˇ z toho, z ˇ e jsme sˇpatne ˇ rozhodli, v jake ´ m kontextu se nacha ´zı´me.

3.1 Skala

´ rnı ´ a

´

seznamovy

kontext

Za´kladnı´mi dve ˇ ma kontexty jsou kontext skala ´ rnı ´ a kontext seznamovy ´ Jestliz ˇ e opera´tor ocˇeka ´ va ´ skala ´ rnı ´ operand nebo funkce ocˇeka ´ va ´ skala ´ rnı ´ operand, r ˇ ı ´ka ´ me, z ˇ e vynucuje skala ´ rnı ´ kontext, a tento operand je vyhodnocen ve skala ´rnı´m kontextu. Napr ˇ ı ´klad prˇir ˇ azenı ´ do skala ´ rnı ´ prome ˇ nne ´ vyhodnocuje pravou stranu prˇir ˇ azovacı´ho pr ˇ ı ´kazu ve skala ´rnı´m kontextu (je ocˇeka ´ va ´ na jedna hodnota), zatı´mco prˇir ˇ azenı ´ do pole vyhodnocuje pravou stranu v seznamove ´ m kontextu (ocˇeka ´ va ´ se seznam hodnot). Neˇktere ´ opera´tory vracejı ´ v kazˇde ´ m z teˇchto kontextu ˚ ru ˚ zne ´ hodnoty

# prave ´ strany prˇirˇazenı ´ vyhodnoceny ve skala´rnı´m kontextu

$x = 1; # vy´sledek ’1’

$x = (’a’, ’b’, ’c’); # vy´sledek ’c’

$x = ’a’, ’b’, ’c’; # vy´sledek ’a’, = ma ´ veˇtsˇı ´ prioritu nez ca´rka

$x = @pole; # vy´sledek je pocet prvku ˚ @pole

# neˇktere opera´tory pracujı pouze se skala´rnı´mi operandy

@x = (’a’, ’b’); @y = (1, 2, 3); $soucet = @x + @y; # $soucet obsahuje hodnotu 5

Vyhodnocenı´m seznamu (kolekce skala ´rnı´ch hodnot uzavr ˇ eny ´ ch v kulaty ´ ch za ´vorka´ch) ve skala ´rnı´m kontextu je poslednı ´ prvek tohoto seznamu. Vyhodnocenı´m prome ˇ nne ´ typu pole ve skala ´rnı´m kontextu je de´lka tohoto pole (tzn. pocˇet prvku ˚ pole). Vyhodnocenı´m prome ˇ nne ´ typu asociativnı ´ pole ve skala ´rnı´m kontextu je hodnota vyjadrˇujı´cı ´ obsazenost hashovacı ´ tabulky pro uchova ´ nı ´ klı´c ˇ u ˚ a hodnot te´to struktury.

Je-li na leve ´ strane ˇ prˇir ˇ azenı ´ seznamova ´ hodnota nebo seznamova ´ prome ˇ nna ´ , je prava ´ strana vyhodnocena v seznamove ´ m kontextu. Takte ´ z ˇ v ra´mci seznamu jsou vsˇechny prvky seznamu vyhodnocova ´ ny v seznamove ´ m kontextu.

# prave ´ strany prˇirˇazenı ´ vyhodnoceny v seznamove´m kontextu ($x) = 1; @pole = 1;

@pole = podprogram();

%hash = (1 => ’a’);

@pole[1..3] = ’a’, ’b’, ’c’;

# argumenty veˇtsˇiny funkcı jsou vyhodnoceny v seznamove´m kontextu print 1, 2, @pole, funkce; podprogram(1, 2, ’abc’, @pole, funkce());

Skala ´ rnı ´ kontext lze vynutit pouzˇitı´m funkce scalar Je trˇeba da´vat pozor na to, z ˇ e se jedna ´ o una ´ rnı ´ opera´tor, proto se vztahuje pouze k bezprostrˇedne ˇ na´sledujı´cı´mu vy ´ razu. Pro vynucenı ´ seznamove´ho kontextu obdobna ´ funkce neexistuje.

@pole = (’a’, ’b’, ’c’, ’d’);

# vynuceny ´ skala´rnı ´ kontext @a = scalar @pole; # @a obsahuje jeden prvek - hodnotu 4, # coz ˇ je pocˇet prvku ˚ @pole podprogram(1, 2, ’abc’, scalar @pole, funkce()); # tady se scalar vztahuje pouze na @pole

Uvnitr ˇ podprogramu mu ˚ z ˇ eme zjistit kontext, v jake ´ m byl podprogram vola ´ n, pomocı ´ funkce wantarray. Ten vracı ´ pravdivou hodnotu v pr ˇ ı ´pade ˇ , z ˇ e podprogram byl vola ´ n v seznamove ´ m kontextu, v ostatnı´ch pr ˇ ı ´padech vracı ´ nepravdivou hodnotu.

V teˇch c ˇ a´stech knihy, kde bude popisova ´ no chova ´ nı ´ jednotlivy ´ ch prvku ˚ jazyka Perl za´visejı´cı´ch na kontextu (vola ´ nı ´ standardnı´ch podprogramu ˚ , pra ´ ce opera´toru ˚ , chova ´ nı ´ pr ˇ ı ´kazu ˚ apod.), bude na rozdı´lne ´ chova ´ nı ´ v ru ˚ zny ´ ch kontextech upozorne ˇ no.

3.2 Logicky ´ kontext, pravdivost

V logicke ´ m kontextu jsou vy ´ razy vyhodnocova ´ ny v pr ˇ ı ´pade ˇ , z ˇ e je trˇeba zı´skat hodnotu pravda nebo nepravda. Vyhodnocova ´ nı ´ pravdivosti se deˇje vzˇdy ve skala ´rnı´m kontextu opera´tory vracejı´cı ´ pravdivostnı ´ hodnotu pracujı ´ se skala ´rnı´mi operandy, pr ˇ ı ´kazy if, while apod. vyhodnocujı ´ podmı´nku ve skala ´rnı´m kontextu. Proto je trˇeba na pravdivostnı ´ vy ´ raz pohlı´zˇet ve skala ´rnı´m kontextu a odlisˇit ho od kontextu seznamove´ho.

if (@pole) {

# probeˇhne pouze v prˇı´padeˇ, z ˇe @pole obsahuje neˇjake ´ prvky, # tzn. jeho de´lka je ru ˚ zna od 0, coz ˇ je nepravdiva hodnota

die ’Nelze deˇlit nulou’ unless $y; print $x/$y;

@a && @b && @c && print ’Vsˇechna trˇi pole obsahujı ´ neˇjake ´ prvky’;

A jak vlastne ˇ pozna ´ me, zda je hodnota pravdiva ´ nebo nepravdiva´? Stac ˇ ı ´ si zapamatovat na´sledujı´cı ´ pravidlo. Pravdive ´ jsou vsˇechny r ˇete ˇ zce krome ˇ ’’ (pra´zdny ´ r ˇeteˇzec) a ’0’, vsˇechna c ˇ ı ´sla krome ˇ 0 a vsˇechny odkazy, nepravdiva ´ je jaka´koliv nedefinovana ´ hodnota (nema ´ hodnotu).

Tab. 3–1: Pr ˇ ı ´klady pravdivy´ch a nepravdivy´ch hodnot

Hodnota Pravdivost 0 nepravdiva ´ 0.0 nepravdiva ´ -OeO nepravdiva ´ 000 nepravdiva ´ 0x0 nepravdiva ´ ”0” nepravdiva ´ ”0.0” pravdiva ´ ”0e0” pravdiva ´

Perl nepodporuje logicky ´ datovy ´ typ (jako je napr ˇ ı ´klad boolean v Pascalu). Pokud chceme uchovat pravdivostnı ´ hodnotu, musı´me pouz ˇ ı ´t bud’ skala ´ rnı ´ nebo seznamovou prome ˇ nnou.

Budeme-li chtı´t pro uchova ´ nı ´ logicke ´ hodnoty pouz ˇ ı ´t skala ´ rnı ´ prome ˇ nnou, pro nastavenı ´ nepravdive ´ hodnoty do nı ´ uloz ˇ ı ´me hodnotu 0, pra´zdny ´ r ˇete ˇ zec nebo nedefinovanou hodnotu, pro hodnotu pravdivou cokoliv jine´ho.

$podminka = 0;

if ($podminka) {

# $podminka obsahuje pravdivou hodnotu

} else {

# $podminka obsahuje nepravdivou hodnotu ... }

Chceme-li pouz ˇ ı ´t prome ˇ nnou seznamovou (pole, hash) a prˇirˇadı´me-li do nı ´ jednu z nepravdivy ´ ch hodnot, nedostaneme vy ´ sledek, jaky ´ bychom potrˇebovali.

@podminka = 0; ... if (@podminka) { # vy´raz @podminka je pravdivy ´ ... }

Vyhodnocenı´m hodnoty 0 v seznamove ´ m kontextu je totiz ˇ jednoprvkovy ´ seznam a vyhodnocenı´m tohoto seznamu ve skala ´rnı´m kontextu je hodnota 1 (de´lka seznamu), coz ˇ je hodnota pravdiva ´ . Proto je jasne ´ , z ˇ e jedinou seznamovou hodnotou, ktera ´ bude v logicke ´ m (a tedy skala ´rnı´m) kontextu vyhodnocena jako hodnota nepravdiva ´ , je pra´zdny ´ seznam.

3.3 Pra´zdny ´ kontext

Vznika ´ tam, kde nenı ´ pozˇadova ´ na z ˇ a´dna ´ na´vratova ´ hodnota nebo neza´lez ˇ ı ´ na jejı´m typu. Pr ˇ ı ´kladem je vola ´ nı ´ podprogramu jako jedine´ho v cele ´ m vy ´ razu nebo pouzˇitı ´ r ˇete ˇ zce jako pr ˇ ı ´kazu (prˇi prˇekladu se zapnuty ´ mi varovny ´ mi hla ´ s ˇenı´mi to vede k varova ´nı´, z ˇ e byla pouzˇita konstanta v pra´zdne ´ m kontextu).

podprogram(); ”abcd”;

3.4 Vkla´dacı ´ kontext

Vznika ´ prˇi vkla´da ´ nı ´ hodnot prome ˇ nny ´ ch a symbolu ˚ zac ˇ ı ´najı´cı´ch znakem obra ´ cene´ho lomı´tka uvnitr ˇ r ˇete ˇ zcu ˚ ohranic ˇ eny ´ ch uvozovkami a v neˇktery ´ ch dals ˇ ı ´ch pr ˇ ı ´padech (opera´tory porovna ´ nı ´ podle vzoru, nahrazenı ´ atd.). V podstate ˇ existujı ´ dva za´kladnı ´ druhy kontextu ˚ jeden, kde vkla´da ´ nı ´ probı´ha ´ , a druhy´, kde vkla´da ´ nı ´ neprobı´ha ´ Podrobne ˇ je princip vkla´da ´ nı ´ popsa ´ n v kapitole 4. Datove ´ typy, prome ˇ nne ´ a 6. Opera´tory

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

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.