Problémy s češtinou České znaky se standardně nepovažují za alfanumerické znaky (\w) Vadí to při třídění vyhodnocování regulárních výrazů Je třeba použít use locale; nebo z příkazového řádku - přepínač Mlocale perl -Mlocale .... Je ale třeba mít locale správně nastavené v shellu.
Odbočka - Locale(s) je soubor jazykových, národních a kulturních pravidel, jako jsou znaková sada, formáty data, času a měny, pravidla pro abecední třídění, a také jazyk zpráv a uživatelského prostředí vůbec. Locale je třeba napřed nastavit v shellu. Důležité proměnné prostředí pro správné zobrazení češtiny: LC_ALL – nastaví všechno najednou LC_kategorie – nastaví konkrétní kategorii LANG – použije se, není-li nastavena kategorie
LC_kategorie LC_kategorie nastavují jednotlivé kategorie. Standardní jsou tyto: LC_COLLATE (pravidla třídění), LC_CTYPE (vlastnosti znaků, malá a velká písmena), LC_MONETARY (formát měny), LC_NUMERIC (formát čísel), LC_TIME (formát data a času), LC_MESSAGES (jazyk zpráv a uživatelského rozhraní).
Nastavení proměnné prostředí v shellu bash: export VARIABLENAME="value" csh/tcsh: setenv VARIABLENAME "value" Zobrazení hodnoty proměnné: echo $VARIABLENAME echo $SHELL echo $LC_ALL
Nastavení locales Obecný formát hodnot: Pro češtinu: Nebo alias: bash: jazyk[_teritorium[.znaková_sada]][@modifikátor] Pro češtinu: Nebo alias: cs_CZ.ISO-8859-2 cs_CZ.UTF-8 czech bash: export LC_ALL="cs_CZ.ISO-8859-2" csh/tcsh: setenv LC_ALL "cs_CZ.ISO-8859-2"
Otevírání souborů 2 způsoby pro čtení (vstupní soubor) open(VSTUP,"ptaci.txt"); Lze otevřít více souborů pro čtení. pro výpis (výstupní soubor) open(OUT,">/export/home/hlava/prijmeni.out"); open(OUT,">>/export/home/hlava/prijmeni.out"); Lze otevřít více souborů pro výpis.
Unicode Třeba explicitně uvést, že pracujeme v kódování UTF-8: use encoding "utf-8"; Otevírání textových souborů v kódování UTF-8: open(VSTUP, "<:utf8" , "ptaci.txt"); open(OUT, ">:utf8", "prijmeni.out"); open(OUT, ">>:utf8", "prijmeni.out");
Ovladač souboru (filehandle) Standardní – vždy k dispozici STDIN STDOUT STDERR – výpis chyb Ostatní je třeba explicitně otevřít pomocí funkce open([ovladač souboru],[mode],[jméno souboru]); Ovladač souboru se tradičně píše velkými písmeny Zavírání souboru: close([ovladač souboru]);
Testování souborů Otevření souboru může být problematické => testy -r soubor lze číst -w do souboru lze zapisovat -x soubor je spustitelný -e soubor existuje -f jde o soubor -d jde o adresář -z soubor má nulovou délku -s soubor má nenulovou délku if(! (–e "soubor")) { open(S,">soubor") } if(-s "vstup" and -r "vstup") open(V,"vstup")
Příkaz die Perlovský idiom: open(SOUBOR,"s.txt") or die "Soubor s.txt nejde otevřít."; die ukončí program a vypíše hlášku na STDERR. Co to znamená? Umíte to zapsat jinak? Speciální proměnná $! pro výpis chybových hlášek: open(SOUBOR,"s.txt") or die "Problém: $!\n"; Když se neotevře soubor, vypíše se např. Problém: Permission denied.
Čtení ze souboru Příklad open(VSTUP,"ptaci.txt"); $prom = <VSTUP>; # do $prom se uloží 1. řádek ze souboru "ptaci.txt" my $cislo_radku = 1; while(<VSTUP>) # totéž jako while($_ = <VSTUP>) { print $cislo_radku++, " ", $_; } close VSTUP;
Zápis do souboru Tady není čárka !!! Do příkazu print napíšeme ovladač souboru, do kterého se má zapisovat print VYSTUP "toto se zapíše do výstupního souboru.\n"; Nezapíše-li se ovladač, zapisuje se do STDOUT print "toto se zapíše na standarní výstup.\n"; totéž jinak (většinou): print STDOUT "toto se zapíše na standarní výstup.\n"; Tady není čárka !!!
Zápis do více souborů (ne najednou) Lze otevřít více souborů a zapisovat pokaždé do jiného např. ladicí tisky na STDOUT nebo do zvláštního jiného souboru (např. LOG), ostatní výstupy do výstupního souboru open(LOG,">log.txt"); open(VYSTUP,">ven.txt"); print LOG "toto se zapíše do souboru log.txt.\n"; print VYSTUP "toto se zapíše do souboru ven.txt.\n"; Ale máme i příkaz select: select LOG; print "toto se zapíše do souboru log.txt, ne na STDOUT!\n";
Parametry souboru Pole @ARGV Při spouštění programu se parametry píšou za jméno souboru Příklad: přepis souboru s očíslovanými řádky program, který přečte všechny zadané soubory a vypíše je tak, že každý řádek předchází jeho pořadí nevíme předem, kolik bude souborů Spuštění programu: ./pocitej.perl soubor_1 soubor_2 ... soubor_n parametry jsou odděleny mezerami
Příklad s polem @ARGV foreach $s (@ARGV) { my $cislo_radku = 1; open(VSTUP, $s) or die "Nelze otevřít soubor $s\n"; open(VYSTUP, ">${s}.out") or die "Nelze otevřít ...."; print "---- $s ----\n"; while($prom = <VSTUP>) print VYSTUP $cislo_radku++, " ", $prom; }
Použití @ARGV Jméno souboru, který se má zpracovat (vstupní soubor) může jich být víc Jméno souboru, který má být výsledkem (výstupní soubor) i těch může být víc Číselné parametry – př.: sečíst čísla od N do M Příklad : jednoduchá kalkulačka
Perl z příkazového řádku Krátké prográmky na jedno použití není třeba uchovávat, lze je spustit přímo z příkazové řádky perl volba Volby -e "příkaz(y)" provede se příkaz -n příkaz se obalí cyklem while -p jako -n, navíc se řádky vytisknou na STDOUT -v vypíše verzi Perlu perl -pe "s/\r//" W_soubor.txt > U_soubor.txt perl –ne "print if/aby/"