Perl1
Perl1 = jednořádkový perl = malý tutoriálek perlu založený na tom, že jednoduché perlovské programy můžeme zadávat jako argumenty interpretru přímo na příkazové řádce shellu, bez pomoci textového editoru. Tak hned sledujeme, co to dělá. Celý tutoriálek je tak napsán jakoby skript v shellu. Hash # zde slouží jako komentář; příkazy, začínající na začátku, jsou příkazy, které píšeme za prompt příkazové řádky. Odsazené řádky, nezačínající #, jsou odpovědi interpretu.
# *** Předmluva # Jedna z vlastností Perlu - zděděná zřejmě od jazyků sed a awk - je, # že se v něm dají psát programy dlouhé i krátké. # A přitom programy v délce jedné řádky nemusí být pouhé hříčky, # ale poměrně silné nástroje. # Nevím, jestli je moje didaktická hypotéza správná: # učit se Perl psaním jednořádkových skriptů. # Zřejmě se to nesmí přehnat. # Sám jsem si napsal před pár lety pár perlovských skriptů # při přípravě některých dokumentů na Web # (Hesla Jednoty bratrské, Bible kralická, převod z T602 apod.), # a teď jsem deostal chuť se v Perlu trochu zdokonalit. # Mám před sebou knížku "Programování v jazyce Perl" # (Larry Wall, Tom Christiansen & Randal L. Schwarz, # vyd. O'Reilly, v překladu Computer Press 1997), # kterou si postupně pročítám a jevy, popsné v jednotlivých # kapitolách, si postupně zkouším tímto způsobem # na krátkých skriptících, zpouštěných přímo ze shellu. # *** Spouštění perlu včetně skriptu z příkazové řádky # *** Problémy interakce ze shellem # Po spuštění perlu s přepínačem -e je očekáván program # nikoliv v připraveném souboru (skriptu), ale na příkazové řádce. # A to je to, co budeme v následujhících cvičeních využívat # - a možná, že občas i zneužívat. # Všechny následující příkazové řádky, začínající příkazem perl, # jsou napsány tak, aby je bylo možno spustit přímo ze shellu # (v Linuxu například přetáhnutím do vedlejšího krakorce (konsoly) # pomocí myši a gpm). # Celý program potom bude ve formě argumentu. # Aby jej shell předal perlu jako celek, je nutno jej uzavřít # do uvozovek. Drobnou nepříjemnou komplikací pak je, # že před všechny uvozovky, které budou součástí vlastního programu, # bude nutno zapsat obrácené lomítko \. # V některých příkladech budou úmyslně chyby. perl -e No code specified for -e. # Chce nějaký program. Vyhovíme: perl -e "" # Nic se nestalo. To je v pořádku. # Pokud jsme nedostali chybové hlášení, můžeme si myslet, # že je to v pořádku. Perl je méně upovídný, než jsem já, # a navíc je maximálně tolerantní - snaží se tiše vyhovět # a zbytečně neprotestovat. # To ale může být nevýhoda pro nás, kteří se jazyk teprve učíme. # Přepínač -w zapne warningy (upozornění na možné chyby). # Více přepínačů je možné slučovat dohromady. # Na jejich pořadí většinou nezáleží. # Ale protože za přepínačem -e se očekává text kódu, # je vhodné uvádět písmeno 'e' až na konci: perl -we "" # Dobře. Náš první program, kterým je 'nic' uzavřené mezi # dvě uvozovky, je zřejmě korektní. Program 'nic' nedělá nic # a jeho výstupem rovněž není nic. Tak je to má být! perl -we "print \"Nazdar\"" Nazdar # Dobře. Kosmetickou chybičkou je, že zpráva "Nazdar" není odřádkovaná # a prompt shellu (zpravidla $) bude hned za ní a ne na novém řádku. # Znak pro novou řádku je "\n" perl -we "print \"Nazdar\n\"" # Dobrý. Chtělo by to ještě s vykřičníkem: perl -we "print \"Nazdar!\n\"" bash: !\n\"": event not found # Chybička se vloudila. Nikoliv do programu, ale příkazový # interpret (v mém případě bash) se znaží dát vykřičníku # nějaký speciální význam. Nezbyte, než i ten vykřičník # uvést obráceným lomítkem. perl -we "print \"Nazdar\!\n\"" Nazdar! # To jsou ony drobné komplikace při zadávání programu # přímo z příkazového řádku: # To, co do příkazového řádku napíšeme, se nejdříve snaží # nějak interpretovat příkazový interpret (shell) # a teprve to, co 'projde', dostane ke zpracování samotný perl. # Proto je dobré, když se nejdříve seznámíte s tím shellem, # který používáte - at už je to bash, sh, csh, tcsh, zsh # anebo jiný Unixový shell, či snad COMMAND.COM v MS-DOSu # (Perl je k disposici i pod takovým operačním systémem). # Abychom se neuzpětnělomítkovali, můžeme celý perlovský # prográmek uzavřít do jednoduchých uvozovek, tj. apostrofů: perl -we 'print "Nazdar!\n"' perl -we 'print "Nazdáreček!\n"' # (Nevím jak vy, ale mně se tam tu češtinu do příkazového řádku # nepodařilo vnutit. Není na vině perl: ten zpracovává # znaky s osmým bitem bez problémů. Ale nepodařilo se mi # přinutit shell, aby znaky s diakritikou toleroval # v příkazové řádce.) # Výhoda použití apostrofů ' místo dvojitých uvozovek " # je ta, že shell takto uzavřený argument interpretuje # o něco méně snaživě. # Nevýhoda je naopak v tom, že pak už nemáme šanci # v celém programu napsat další apostrof # - a nepomůže nám ani zpětné lomítko: perl -we 'print "It\'s already 10 o\'clock and Bill hasn\'t come yet.\n"' # Jediná šance je vrátit se zase ke dvojitým uvozovkám: perl -we "print \"It's already 10 o'clock and Bill hasn't come yet.\n\"" # Pokud na konci zapomeneme napsat ukončovací uvozovku, # shell pozná, že tu ještě něco chybí - což naznačí # i tzv. pokračovacím promptem na začátku další řádky, # většinou zobákem > # To nám dává možnost psát krátké skripty i na několik řádek: perl -we 'print " Ententyky dva spaliky cert vyletel z elektriky bez klobouku bos natloukl si nos "' # Všimněme si, že celý řetězec mezi dvojitými uvozovkami # perl vytiskne tak, jak je - včetně konců řádek # a dvojitého odřádkování na konci, # aniž bychom museli konce řádků vyznačovat znaky "\n" # *** Datové typy # Data se ukládají do proměnných. # První znak názvu proměnné určuje, # jaký datový typ proměnná obsahuje: # $ skalár # @ pole # % hash (tj. asociativní pole). # Další znak jména proměnné by mělo být písmeno, # a pak libovolně písmena či číslice. # Anebo samé číslice. Podtržítko je jako písmeno. # Skalár je jednoduchý typ a vpodstatě je jedno, # jestli se jedná o číslo nebo o řetězec. perl -we ' $jmeno = "Petr"; $cele_cislo = 123_456_789; $desetinne = 12.345; $vedecka_notace = 1.23E3; $hexa = 0xff; $oktalove = 077; # zacina nulou print $jmeno, $cele_cislo, $desetinne, $vedecka_notace, $hexa, $oktalove,"\n";' # Výsledek je možná neočekávaný: Petr12345678912.345123025563 # Všechno je splácáno pěkně dohromady. # Ta řada argumentů příkazu print, oddělených čárkami, # totiž tvoří seznam, který se vytiskne tak, # že se tisknou všechny jeho elementy jeden za druhým. # Proto bude lepší vytisknout výsledky ve tvaru řetězce tak, # že argumenty uzavřeme do uvozovek, tj. poslední řádek nahradíme: print "$jmeno $cele_cislo $desetinne $vedecka_notace $hexa $oktalove\n";' Petr 123456789 12.345 1230 255 63 # Tomu se říká vkládání: proměnné, uvedené ve dvojitých # uvozovkách, se interpolují, tj. nahradí se svými hodnotami. # Pokud bychom použili jednoduché uvozovky (apostrofy), # k expansi by nedošlo. # Čísla, která jsme zadali hexadecimálně nebo oktalově, # se ale (samozřejmě) tisknou decimálně. # Pro lepší kontrolu výstupu je dobré použít formátování: printf "%s, %d, %g, %g, 0x%x, 0%o \n", $jmeno, $cele_cislo, $desetinne, $vedecka_notace, $hexa, $oktalove;' Petr, 123456789, 12.345, 1230, 0xff, 077 # Toho se dá využít pro převod mezi číselnými soustavami. # Následující prográmek vytiskne tabulku znaků # a jejich kódy desítkově, hexadecimálně a oktalově: perl -we ' print "dec\thex\toct\tznak\n"; while ($i++<255) { printf "%d\t%x\t%o\t%c\n", $i, $i, $i, $i;}' # Na vysvětlenou: # \t je znak pro tabelátor # while (podmínka) {tělo cyklu} # je konstrukce pro cyklus. # Předtím nikde neuvedená proměnná $i je inicializována na 0, # pak testována a pak inkrementována o jedničku.