PB173 Perl 05 Vstup a výstup Roman Lacko Obsah Thanatológia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  1 Vstup a výstup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  11 Thanatológia bIlujDI' yIcheghQo'; yIHegh()! It is better to die() than to return in failure. — Klingon programming proverb, perldoc autodie PB173 Perl 1 / 22 exit V niektorých prípadoch nestačí vrátiť undef ako indikáciu chyby a je nutné ukončiť beh celého skriptu: exit [EXPRESSION] • Ukončí skript s uvedeným chybovým kódom. • Bez argumentu znamená exit 0. POSIX sémantika: 0 úspešný beh 1-255 neúspený beh PB173 Perl 2 / 22 die die LIST Ekvivalent throw v iných jazykoch. Ak má zoznam viac než jeden prvok, spojí ich do jedného reťazca. Prázdny zoznam sa nahradí "Died".  Perl nemá ekvivalent štandardnej triedy pre výnimky, použitie reťazcov je najjednoduchšie. Ak text výnimky nekončí \n, Perl pridá aj informáciu u tom, kde k úmrtiu došlo. PB173 Perl 3 / 22 eval eval EXPRESSION eval BLOCK Vykoná Perl kód a zachytí prípadné chyby (napr. die) v premennej $@. eval "say no more"; # String eval eval { something_may_die_here(); } # Block eval if ($@) {   say STDERR "Whoopsie: $@";   exit 1; }  Použitie eval na reťazci z neovereného zdroja môže mať nepriaznivé účinky na vaše mentálne zdravie a bezpečnosť programu. PB173 Perl 4 / 22 warn warn LIST Podobné ako die, s drobnými rozdielmi: • Výnimku nevyhodí, len vypíše na chybový výstup. • Ak je LIST prázdny, použije $@ alebo "Something went wrong". PB173 Perl 5 / 22 %SIG Hash, ktorý obsahuje reakcie na signály. Tie zatiaľ podobne rozoberať nebudeme. V tomto hashi sa nachádzajú aj špeciálne kľúče __DIE__ a __WARN__, ktoré spustia reakciu na die resp. warn. $SIG{__DIE__} = sub ($ex) {   say "About to die due to $ex"; }; Výnimku je odtiaľ možné znova vyhodiť pomocou die.  Spracovanie výnimky zo $SIG{__DIE__} je možné zrušiť len pomocou goto. PB173 Perl 6 / 22 Návod na zomieranie Kedy použijeme ktorý spôsob? exit Chyba na najvyššej úrovni skriptu, napr. nesprávny počet argumentov. die Chyba vo funkcii alebo metóde, na ktorú môže chcieť volajúci kód reagovať. warn Keď niečo vyzerá podozrivo, ale v princípe môžeme pokračovať. PB173 Perl 7 / 22 Odbočka: Moduly Carp use Carp; carp "There is something fishy"; croak "The argument is undefined, you twat"; confess "I can't go on"; Carp::cluck "What is this?" # Not imported by default Varianty die a warn vhodné pre moduly, chybu zahlásia v kontexte volajúceho kódu. Funkcie confess a Carp::cluck vypíšu stack trace. PB173 Perl 8 / 22 Odbočka: Moduly Try::Tiny use Try::Tiny; try {   EXPRESSION; } catch {   # Exception is caught in ‹$_›.   say "Caught $_"; };  Tento modul nie je v jadre Perlu. Môžete ho však používať v domácich úlohách, ak bude treba. PB173 Perl 9 / 22 Odbočka: Moduly a pragmy autodie use autodie; chdir "/wonderland"; # Dies instead of returning false value Mnohé funkcie namiesto vrátenia chybového kódu zavolajú die. Nie je to modul, ale lexikálna pragma (ako strict a warnings). Môžete ju vypnúť v bloku pomocou no autodie. PB173 Perl 10 / 22 Vstup a výstup Perl pri spustení otvorí jeden vstup a dva výstupy: • STDIN • STDOUT • STDERR  Tieto slová sú barewords, tzn. nemajú sigil. Funkcie say, print a printf môžu mať ako prvý argument výstup: say "Default output"; say STDOUT "Standard output"; # Same thing say STDERR "Standard error output"; PB173 Perl 11 / 22 Otvorenie súboru open FILEHANDLE, MODE, FILENAME Otvorí súbor v zadanom režime a priradí ho do premennej. Ak zlyhá, vráti undef. Režimy otvorenia pripomínajú shell: < čítanie > zápis >> pridávanie na koniec +< čítanie so zápisom +>  zápis s čítaním +>>  pridávanie s čítaním PB173 Perl 12 / 22 Otvorenie súboru  Vždy kontrolujte open!  Použite or die open my $handle, '<', $filename   or die "$filename: $!"; Premenná $! je ekvivalent errno. Pozor na rozdielnu prioritu || a or. PB173 Perl 13 / 22 Čítanie zo súboru readline EXPRESSION • V skalárnom kontexte prečíta jeden riadok, po poslednom vráti undef. • V zoznamovom kontexte vráti všetky riadky. while (my $line = readline $fh) { # or <$fh>   # Do something with line. }  Ak sa výraz s readline alebo <> použije ako podmienka cyklu, testuje sa defined, nie logická hodnota. Prečo je to užitočné?  To, čo Perl považuje za riadok, záleží od premennej $/. PB173 Perl 14 / 22 Diamond operator while (my $line = <>) {   # ... } Postupne otvorí všetky súbory v @ARGV a číta ich. Spracuje aj STDIN, ak: • Práve skúmaný argument je • @ARGV je inicilálne prázdne. Perl pridá aj automatické premenné: • $ARGV — Názov práve spracovávaného súboru • ARGV — File handle pre otvorený súbor  Na spracovaní všetkých argumentov bude @ARGV prázdne. PB173 Perl 15 / 22 Odbočka: chomp chomp VARIABLE chomp (LIST) Funkcia readline ponecháva na konci riadka \n. Táto funkcia to odstráni.  Presnejšie z konca vymenovaných premenných odstrání hodnotu $/. while (defined(my $line = readline $fh)) {   chomp $line;   # ... } PB173 Perl 16 / 22 Zatvorenie súboru close FILEHANDLE Vyleje buffer súboru a zatvorí ho.  Perl zatvorí súbor automaticky, ak všetky premenné s odkazom ukončia svoju životnosť. PB173 Perl 17 / 22 Ďalšie režimy open open my $fh, '+>', undef # or die ...; Vytvorí dočasný anonymný súbor. Jediný zmysluplný režim je +>. open my $fh, '<', \$scalar # or die ...; In-memory file, zápis alebo čítanie do skalárnej premennej v pamäti. PB173 Perl 18 / 22 Ďalšie režimy open open my $fh, '>&', HANDLE; open my $fh, '<&', HANDLE; open my $fh, '<&=', DESCRIPTOR; ... Otvorí $fh ako kópiu iného vstupu alebo výstupu. PB173 Perl 19 / 22 Ďalšie režimy open open my $fh, '|-', "COMMAND"; open my $fh, '-|', "COMMAND"; Spustí v ďalšom procese príkaz COMMAND a presmeruje mu vstup |- alebo výstup -|. PB173 Perl 20 / 22 Open open s menším počtom argumentov open FILEHANDLE, EXPR • Režim a názov súboru v jednom argumente, napr. " Operátor <> volá na pozadí ekvivalent open ARGV, $ARGV. Čo urobí nasledujúci príkaz? perl -Mv5.34 -e 'print while <>' 'ls $HOME |' A čo ak ls nahradíme rm -rf? Riešenie je operátor <<>>, ktorý sa chová ako <>, ale používa open s troma argumentami. Druhý je vždy <.  Operátor <<>> chápe - ako názov súboru. PB173 Perl 22 / 22