Programovací jazyk Perl

Slides:



Advertisements
Podobné prezentace
Standardní knihovní funkce pro práci s textovými řetězci
Advertisements

Pro začátek něco lehčího
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
ŘÍDÍCÍ STRUKTURY - PODMÍNKY
Dynamické dokumenty na straně klienta Informatika pro ekonomy II.
Seznamy Seznam = očíslovaná posloupnost skalárů Zápis seznamu do kulatých závorek: ("máslo")# jednočlenný seznam (1,2,3)# seznam se 3 členy ("jedna",2,3,"osm",100,$pozdrav)
Perl Co je Perl a na co je dobrý Základní konstrukce jazyka
Operační systém UNIX Soubory a adresářová struktura Roman Danel
Programování funkcí v Excelu
HYPERTEXT PREPROCESSOR. JAZYK PHP. Jazyk PHP (Hypertext PreProcessor) je intepretovaný jazyk určený pro web. Je celkem jednoduchý, snadno přenositelný.
Jazyk VHDL Martin Štěpánek
Opakování Co je výsledkem následujícího prográmku? my $a="kol"; my $b="o"; $a.= $b; $b.= $a; print "a = $a, b = $b\n"; Vkládání speciálních znaků? Uvozovací.
Příkazy Přednáška č. 4. Příkazy (statements)  Příkaz – dílčí krok programu (část kódu – zpravidla jeden řádek)  Program – posloupnost příkazů  Příkazy.
VISUAL BASIC Práce se soubory.
If-else, do-while, switch, operátory
Programování v C++ Cvičení.
Algoritmy I Cvičení č. 4.
Programování v Pascalu Přednáška 7
Materiály k přednášce Úvod do programování Ondřej Čepek.
MATLAB® ( část 3 - scripty).
Informatika I 3. přednáška
Přístupová práva, maska přístupových práv Jiří Hořejší.
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
Datové typy a práce s nimi
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Počítače a programování 1
JavaScript Podmínky, cykly a pole.
3. Příkazy  Příkazy dělíme na jednoduché a strukturované.  Jednoduché příkazy - žádnou jejich dílčí částí neni příkaz - přiřazovací, vstupu a výstupu,
OSNOVA: a)Programování se soubory b)Záloha databáze v souboru c) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování.
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
UNIX — doplňky Informatika pro ekonomy II přednáška 9.
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Algoritmizace a programování Textové soubory - 13 Mgr. Josef Nožička IKT Algoritmizace a programování
KIV/PPA1 cvičení 9 Cvičící: Pavel Bžoch. Osnova cvičení Třída String a její metody –Řetězce a operace s nimi.
Pole Arrays.
A1PRG - Programování – Seminář Ing. Michal Řízení běhu programu 5 Verze
Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů.
PROGRAMOVÁNÍ V PHP PERSONAL HOME PAGES CYKLY V PHP.
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
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.
Úvod do UNIXu (4 th round) David Hoksza (většina sekce o vi a obrázek na slidu 7 převzat od Libora Forsta –
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Úvod do UNIXu (6th round)
Balíky Hlavní balík - main - zatím jsme s jiným nepracovali Rozdělují tzv. namespaces = množiny jmen pro proměnné $lemma = "cukr"; znamená $main::lemma.
Řetězce String. Co je to řetězec Jako řetězec označujeme pojmenovanou skupinu libovolných znaků Deklarujeme jej pomocí příkazu Délka řetězce není v tomto.
Podprogramy (subroutines) Pojmenované kousky programu, které –tvoří logicky ucelené části –se v programu opakují Jsou zapsány na jednom místě a v případě.
IB111 Práce se soubory Správa paměti. Práce se soubory v Pythonu Soubor musíme „otevřít“ Poté s ním pracujeme –Čteme a/nebo zapisujeme Nakonec musíme.
Programování KONSTANTY, ČTENÍ PO JEDNOM ZNAKU GETCHAR() FORMÁTOVANÝ VÝSTUP POMOCÍ PRINTF, VÝVOJOVÉ DIAGRAMY, CYKLY.
Programovací jazyk C# 2. část. Datové typy C# rozeznává dva druhy datových typů, hodnotové a referenční. Hodnotové datové typy Proměnné hodnotového datového.
Programovací jazyk C# 4. část - cykly.
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Definiční obor a obor hodnot
Výukový materiál zpracován v rámci projektu
Výukový materiál zpracován v rámci projektu
Linux - skripty Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Libor Otáhalík. Dostupné z Metodického portálu ISSN: 
Úvod do programování 6. hodina
Algoritmizace a programování
Kurz algoritmizace a programování v jazyce C
Funkce výstupu (2) Funkce printf: deklarována v: stdio.h
Databázové systémy a SQL
Řetězce (24) Funkce strchr: deklarována v: string.h
Databázové systémy a SQL
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
Databázové systémy a SQL
Opakování ze 4. cvičení int a; printf("Zadej číslo: ");
Transkript prezentace:

Programovací jazyk Perl Počítačové zpracování češtiny Programovací jazyk Perl Daniel Zeman http://ufal.mff.cuni.cz/course/popj1/

PERL Practical Extraction and Report Language Praktický jazyk pro extrakci informací a jejich shrnutí

PERL Interpretovaný programovací jazyk pro zpracování textu. Snadné čtení a psaní souborů. Snadná práce s regulárními výrazy. Šetří deklarace, konverzi typů apod. Přenositelný: Unix, Windows i Mac. Nepříliš efektivní. Návrh a test v PERLu, trvalá implementace třeba v C. 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Dostupnost Perlu Perl je zadarmo. Na Unixech běžně (alespoň Linux). Zkuste příkazy which perl a perl -v. Pro Windows ke stažení např. na: http://strawberryperl.com/ http://www.activestate.com/ Dokumentace: http://www.perldoc.com/ 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Spojení programů s interpretem Perl Unix: souboru s programem umožnit spouštění: chmod +x program.pl na prvním řádku programu uvést cestu k interpretu, například: #!/usr/bin/perl Windows: dvakrát kliknout na soubor s programem, na požádání udat, že se má otvírat Perlem => problém s předáním parametrů! při spouštění z příkazového řádku před jméno programu přidat volání Perlu, například: perl program.pl v současných Windows (NT a výš) už to není (někdy!) potřeba 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Skalární proměnné #!/usr/bin/env perl $a = 10; $b = 5; $c = $a + $b; print "Součet ", $a, " a ", $b, " je ", $c, ".\n"; 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Skalární proměnné Proměnné se nemusí deklarovat. Typ je benevolentní a udává ho první znak jména: $ znamená skalár. Skalár je podle kontextu řetězec, celé číslo nebo desetinné číslo. Do proměnných se přiřazuje pomocí operátoru =: $soucet = $a + $b. 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Pole Proměnná začínající znakem @ je pole. Není třeba předem deklarovat velikost pole. Prvky pole jsou skaláry. Prvky téhož pole mohou být řetězce i čísla. Mohou existovat dvě různé proměnné, lišící se pouze tím, že jedna je skalár a druhá pole: $x a @x. Není mezi nimi žádný vztah! 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Pole Pozor: prvek pole je skalár, takže se k němu přistupuje takto: $x[0] je první (tj. nultý) prvek pole @x. $#x je rezervovaná proměnná: nejvyšší index v poli @x. Tedy poslední prvek je $x[$#x]. Alternativně: $x[-1] == $x[$#x]. 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad $x[0] = "pes"; $x[1] = 34; # $#x je původně -1, protože @x neexistuje. $x[++$#x] = "pes"; push(@x, 34); 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Vztah polí a řetězců Řetězec lze rozložit na pole skalárů (řetězců) funkcí split. Pole lze převést na řetězec funkcí join. V obou případech lze udat „oddělovač“. 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad $avar = "abc;def;g"; @x = split(/;/, $avar); @x = ("abc", "def", "g"); $avar = join(";", @x); 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Řídící struktury Řídící struktury (podmínky, smyčky) jsou podobné jako v céčku, ale všechny bloky musí být povinně uzavřeny ve složených závorkách. Smyčky: while, for, foreach. Podmínky: if … [[elsif …] else …]. 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad: cyklus while. # Dokud podmínka platí, provádět příkazy. $x = 0; while($x < 5) { print $x,"\n"; $x++; } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad: cyklus for for ($i=0; $i<=$#x; $i++) # Provést první výraz (jednorázově na začátku). Zkontrolovat, zda platí podmínka ve druhém výrazu. Pokud ano, provést příkazy v těle cyklu. Po nich provést třetí výraz a skočit zpět na test podmínky. for ($i=0; $i<=$#x; $i++) { print $x[$i], "\n"; } foreach $x (@pole) { print "$x\n" } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad: podmínka if ($x == 1) { print "jedna\n"; } elsif ($x == 2) { print "dva\n"; } else { print "mnoho\n"; } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Relační operátory Porovnávání čísel jako v céčku: rovno ==, nerovno !=, menší <, větší >, menší nebo rovno <=, větší nebo rovno >=. "001"=="1" Porovnávání řetězců: rovno eq, nerovno ne, menší lt, větší gt, menší nebo rovno le, větší nebo rovno ge. "001"ne"1" 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Asociativní pole (hash) Hašovací tabulka. Seznam dvojic klíč – hodnota. Jméno proměnné začíná na %, ale hodnoty jsou skaláry, takže opět začínají $. Do pole x vložit slovo „dog“ a asociovat ho se slovem „pes“: $x{"pes"} = "dog"; 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad: asociativní pole for($i=0; $i<=$#vstup; $i++) { @radek = split(",", $vstup[$i]); $cs = $radek[0]; $en = $radek[1]; $slovnik{$cs} = $en; } while(($cs,$en) = each %slovnik) { print $cs, " ", $en, "\n"; } Na konci vrátí FALSE, pak znova od začátku. Nesetříděné! Říct, jak setřídit prvky asociativního pole: @klice = sort {$a <=> $b;} keys(%hash); for($i = 0; $i<@keys; $i++) { print(“$klice[$i]: $hash{$klice[$i]}”); } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Třídění a výpis hashe @klice = keys(%slovnik); @x = sort { return $slovnik{$a} cmp $slovnik{$b}; # <=> # -1: $a lt $b; 0: $a eq $b; +1: $a gt $b } (@klice); Říct, jak setřídit prvky asociativního pole: @klice = sort {$a <=> $b;} keys(%hash); for($i = 0; $i<@keys; $i++) { print(“$klice[$i]: $hash{$klice[$i]}”); } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Čtení standardního vstupu Právě čtený řádek je ve zvláštní proměnné $_: while(<STDIN>) { print "> ", $_; } Jméno souboru jako argument, není-li, pak STDIN: while(<>) { print; } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Typické použití Perlu: filtr na textové soubory preproc | program.pl | postproc preproc | program.pl (na obrazovku) cat vstup | program.pl | postproc program.pl < vstup | postproc program.pl vstup > vystup cat (Unix) = type (Windows) 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Čtení z pojmenovaného souboru Ale konstantní cesty jsou zřídkakdy ospravedlnitelné! open(SOUBOR, "text.txt") or die("Nelze otevřít: $!\n"); while(<SOUBOR>) { ... } close(SOUBOR); Po dočtení souboru vrací už pořád FALSE, až než soubor znova otevřeme. Říct také o: <STDIN> while(<>) {...} $_ = <SOUBOR>; eof(SOUBOR) 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Převzetí parametrů z příkazového řádku open(SOUBOR1, $ARGV[0]); while(<SOUBOR1>) { $n1++; } close(SOUBOR1); open(SOUBOR2, $ARGV[1]); while(<SOUBOR2>) { $n2++; } close(SOUBOR2); if($n1>$n2) {print "první delší";} else {print "druhý delší";} 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Předání parametrů na příkazovém řádku perl program.pl -xyz text2.txt $ARGV[0] $ARGV[1] $#ARGV==1 @ARGV==2 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Volby a jejich argumenty Můžeme ručně procházet @ARGV a hledat argumenty začínající pomlčkou (volby) Pracné: typicky chceme volby v libovolném pořadí, některé volby mají své argumenty, alternativní psaní atd. Řešení: knihovna Getopt V @ARGV nechá jen nepoužité argumenty Umí boolovské, numerické i řetězcové volby use Getopt::Long; my $volba = 'DEFAULT'; GetOptions('lang=s' => \$volba); 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Čtení výstupu z jiných programů Používá se mechanismus „roury“ — příklad: dir | more open(SOUBOR, "dir |"); while(<SOUBOR>) { print; # Totéž co print($_); } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Regulární výrazy \s mezera nebo tabulátor ^ začátek řetězce $ konec řetězce a písmeno a a? 0 nebo 1 výskyt a a+ 1 nebo více a za sebou a* 0 nebo více a za sebou (ab)+ 1 nebo více řetězců "ab" [^abc] jiný znak než a, b nebo c [a-z] libovolné malé písmeno . libovolný znak Říct o hladovosti indikátorů počtu výskytů a o tom, jak docílit opak: a*?, a+?, a?? 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Standardní porovnávání je hladové Lze-li podmínky výrazu splnit více způsoby: a? najde-li a, vezme ho a+ vezme tolik a, kolik je možné a* vezme tolik a, kolik je možné a?? nemusí-li, nevezme ho a+? vezme jen tolik a, kolik je nutné a*? vezme jen tolik a, kolik je nutné Říct o hladovosti indikátorů počtu výskytů a o tom, jak docílit opak: a*?, a+?, a?? 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Regulární výrazy v podmínkách Zjistit, jestli řetězec $x obsahuje podřetězec "abc": if ($x =~ /abc/) { … } Zjistit, jestli řetězec $x začíná podřetězcem "abc": if ($x =~ /^abc/) { … } Zjistit, jestli řetězec $x začíná velkým písmenem: if ($x =~ /^[A-Z]/) { … } Zjistit, jestli řetězec $x nezačíná malým písmenem (první ^ reprezentuje začátek řetězce, druhé negaci): if ($x =~ /^[^a-z]/) { … } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Záměna řetězců pomocí regulárních výrazů Pokud je způsob "g", výsledkem operace je řetězec, v němž jsou všechny výskyty podřetězce zdroj nahrazeny podřetězcem cíl. Pokud je způsob prázdný, nahradí se pouze první výskyt. s/zdroj/cíl/způsob Zaměnit v řetězci $x všechna a na b: $x =~ s/a/b/g; Nahradit první a v řetězci $x písmenem b: $x =~ s/a/b/; 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad: záměna pomocí regulárních výrazů Nahradit všechny řetězce po sobě jdoucích áček jediným písmenem a: $x =~ s/a+/a/g; Odstranit všechny řetězce áček: $x =~ s/a+//g; Odstranit mezery na začátku řetězce: $x =~ s/^\s+//; N-tý uzávorkovaný úsek zdroje lze zkopírovat do cíle: $x =~ s/<A>(.*?)<\/A>/<B>$1<\/B>/g; 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad 1: Četnosti slov while(<STDIN>) { $_ =~ s/^\s+//; # Odstranit mezery na začátku. Pokud řádek začíná mezerami, první prvek pole slov by byl prázdný. @slova_na_radku = split(/\s+/,$_); # Rozdělit řádek na pole slov. Zatím neuvažujeme interpunkci, takže slovo jde od mezery do mezery! foreach $slovo (@slova_na_radku) { $cetnosti{$slovo}++; } } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad 2: Četnosti dvojic slov while(<STDIN>) { $_ =~ s/^\s+//; @slova = split(/\s+/,$_); for ($i=0; $i<=$#slova-1; $i++) { $dvojice = $slova[$i]. " " .$slova[$i+1]; $cetnosti{$dvojice}++; } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad 3: Četnosti třípísmenných koncovek while(<STDIN>) { $_ =~ s/^\s+//; @slova = split(/\s+/,$_); for($i = 0; $i <= $#slova; $i++) { $l = length($slova[$i]); $klic = $l<3 ? $slova[$i] : substr($slova[$i], $l-3, 3); $konc{$klic}++; } } Zmínit se o funkci substr: $podretezec = substr($retezec, $zacatek, $delka) 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Příklad 4: Lepší dělení na slova while(<STDIN>) { s/([,;:\-.?!])/ $1/g; # operuje nad $_ s/^\s+//; @slova = split(/\s+/, $_); foreach my $slovo (@slova) { print "<w>$slovo</w>\n"; } 5.4.2017 http://ufal.mff.cuni.cz/course/popj1

Cvičení Rozšiřte program na označování slov tak, aby všem celým číslům přiřadil značku <n>. Je-li číslo rozděleno mezerami (např. 1 650 000), odstraňte tyto mezery a číslo slepte. Před značku interpunkce vložte samostatný řádek se značkou <D> všude tam, kde byla původně interpunkce přilepena ke slovu. Tam, kde byla mezera před interpunkcí už v originále, nic nepřidávejte! 5.4.2017 http://ufal.mff.cuni.cz/course/popj1