Programovací jazyk Perl
V zimním semestru 2014/2015 vyučujeme programovací jazyk Perl. Přednášíme ve dvojici Karolína „Karryanna“ Burešová a Martin Mareš, cvičení vede Karry. Hodiny probíhají v úterý, přednášky od 10:40 v S8, cvičení od 9:00 v SU1.
Potřebujete-li s námi řešit cokoliv ohledně výuky, je nejlepší volbou psát na e-mail předmětu perl@ucw.cz, který oba čteme. Můžete nás také zkusit zastihnout v S322.
Co se probíralo
Datum | Probraná látka | Tahák | Perldoc | Cvičení |
07.10.2014 | Motivace; Základní syntaxe: struktura programu, komentáře, typy proměnných, sigily, deklarace proměnných, modifikátory za příkazem, řídící konstrukce | Základní základy | perlintro, perlsyn | Pořízení Perlu, dokumentace, ladění, interaktivní Perl |
14.10.2014 | Zbytek syntaxe: literály, kontext, operátory. Základy práce se soubory, základy tvorby vlastních subrutin (funkcí). | Operátory a spol | perldata, perlnumber, perlop, perlopentut, perlfunc | 2. cvičení |
21.10.2014 | Datové typy důkladněji, reference | Datové typy a reference | perldata, perlref | Rekapitulace funkcí, úlohy z minula |
04.11.2014 | Regulární výrazy a vše, co se pod ten název schová Je dostupný videozáznam z regexové přednášky. | Regexy | perlop, perlre | 5. cvičení |
11.11.2014 | Perl a Unicode, směs dodatků k dřívějším přednáškám Je dostupný videozáznam z unicodové přednášky. | UniCode a směs | perluiintro, perlunicode, perlunifaq, perlfunc, perlsub, perlsyn | 6. cvičení |
18.11.2014 | Balíčky, moduly, objekty Je dostupný videozáznam z objektové přednášky. | Moduly a objekty | perlmod, perlmodlib, perlootut, perlobj, perlpragma | Příklady z minula |
25.11.2014 | Náhledy do standardních modulů a knihoven. File::*, Moose a další. Je dostupný videozáznam z první přednášky o knihovnách. | PDF s příklady | ||
02.12.2014 | Druhý díl náhledů do standardních modulů. DBI, AnyEvent a další. Je dostupný videozáznam z druhé přednášky o knihovnách. | (viz slidy z minulé přednášky) | ||
09.12.2014 | Propojení Perlu a C Je dostupný videozáznam z přednášky o vnitřnostech Perlu. | Slidy z přednášky | Několik zbývajících modulů: Email, Storable, POSIX, Digest; různá řešení převodu římských čísel | |
16.12.2014 | Perl 6 Je dostupný videozáznam z první přednášky o Perlu 6 a odkaz na slíbenou periodickou tabulku perlích operátorů. | Perl 6 -- obsáhlý úvod | Zkouška zkoušky Program k napsání: Rozdělení souborů do ekvivalenčních tříd podle obsahu; na vstupu je cesta; na výstupu rozdělení souborů do skupin tž. ve stejné skupině jsou soubory se stejným obsahem; pro nejlepší hodnocení musí program pracovat rozumně efektivně Program k pochopení | |
06.01.2015 | Je dostupný videozáznam z druhé přednášky o Perlu 6. | 11. cvičení |
Domácí úkoly
Na zápočet je třeba nasbírat 40 bodů.
Zadáno | Termín | Kód | Body | Zadání | Připomínky |
08.10. | 19.10. | euk | 5 | Napište v Perlu program implementující Eukleidův algoritmus. Program dostane jako argumenty dvě čísla, na standardní výstup vypíše jejich největšího společného dělitele. Argumenty programu jsou uloženy v poli ARGV, první argument na indexu nula atd. | Připomínky k euk |
14.10. | 26.10. | fce | 7 | Napište funkci, jejíž chování se bude měnit v závislosti na tom, v jakém kontextu byla zavolaná. Funkce dostane jediný argument, a to název souboru. Ve skalárním kontextu vrátí počet řádků daného souboru. V seznamovém kontextu vrátí trojici, a to opět počet řádků, a navíc délku nejkratšího řádku a délku nejdelšího řádku. Ve void kontextu si postěžuje na plýtvání systémovými prostředky. Pokud daný soubor neexistuje, funkce vrátí false. Chování pro prázdné soubory si vhodně dodefinujte. | Připomínky k fce |
21.10. | 08.11. | spoj | 10 | Pomocí referencí naimplementujte spojový seznam. Každý prvek bude reprezentovaný
jako odkaz na hash, prvky tohoto hashe budou předchozí prvek, následující prvek
a hodnota prvku. Podobně začátek seznamu byste měli mít uložený jako referenci na
hash, jeho prvky zvolte podle svého uvážení. Měli byste poskytnout minimálně následující funkce:
| Připomínky k spoj |
21.10. | 08.11. | self | 1 | Napište funkci, jejímž výsledkem je pole, které obsahuje referenci na sebe sama. | Připomínky k self |
05.11. | 16.11. | dump | 7 | Napište funkci chovající se jako zjednodušený Data::Dumper. Musí si poradit
se skaláry, poli, hashi a referencemi na pole a na hashe. Můžete předpokládat,
že vstup bude acyklická struktura. 1-2 bonusové body dostanete za pěkné formátování výstupu. Další 2 bonusové body dostanete, pokud si vaše implementace poradí s cykly. | Připomínky k dump |
05.11. | 16.11. | ip | 5 | Napište regulární výraz, který bude odpovídat platným IPv4 adresám. | Připomínky k ip |
12.11. | 23.11. | fold | 7 | Napište funkci chovající se jako haskellovský fold. Bude přijímat dva argumenty, výraz a pole. Výraz (zadaný uživatelem) bude obsahovat proměnné $a a $b, podobně jako výraz např. pro sort. Výsledkem funkce bude pro jednoprvkové pole jediný prvek tohoto pole, jinak výsledek aplikace výrazu na výsledek fold-u (se stejným výrazem) pro pole o jedna menší a na poslední prvek pole. To samé v méně slovech, fold(f, a[i..i]) = a[i], fold(f, a[0..n]) = f(fold(f, a[0..n-1]), a[n]). | Připomínky k fold |
12.11. | 23.11. | html | 10 | Implementujte funkci, která pomocí regulárních výrazů (v perlovském slova smyslu) ověřuje, že řetězec je platným zápisem HTML, resp. jeho podmnožiny. Tato podmnožina je popsaná v poskytnutém testovacím kódu. | Připomínky k html; Autorské řešení |
21.11. | 03.12. (středa) | tree | 10 | Implementujte třídu pro reprezentaci binárních stromů, a z ní dědící třídu pro reprezentaci binárních vyhledávacích stromů. Obě by měly poskytovat metody pro přidání a odebrání prvku, pro zjištění, zda daný prvek je ve stromě a pro výpis všech prvků ve stromě. Třída binárních vyhledávacích stromů by dále měla umět vrátit minimum a maximum v daném stromě. Předpokládejte, že prvky ukládanými do stromů budou reference na objekty, které poskytují metodu porovnání s jinou instancí. Porovnávací funkce vrací záporné číslo, nulu, nebo kladné číslo, pokud je instance, na které metodu voláte, menší, stejná, nebo větší než ta, s kterou se porovnává. | Připomínky k tree |
21.11. | 03.12. (středa) | xiv | 2-8 | Implementujte funkci, která převádí římská čísla na arabská, a zkuste
to udělat na co nejméně znaků. Nejkratší řešení dostane 8 bodů, ostatní
funkční řešení dostanou 2-7 podle délky. Pravidla:
| Připomínky ke xiv; došlá řešení: |
26.11. | 07.12. | tie | 10 | Pomocí tie vytvořte hash, jehož klíči budou jména souborů na disku, hodnotami těchto klíčů budou obsahy souborů s daným jménem. Předpokládejte, že jména souborů obsahují pouze alfanumerické znaky. | |
26.11. | 07.12. | frac | 10 | Vyzkoušejte si overload. Nadefinujte třídu pro reprezentaci zlomků a přetěžte operátory pracující s jejími instancemi. | |
02.12. | news | 6 | Vyberte si svůj oblíbený zpravodajský server. Napište program, který se na tento server
připojí a vypíše seznam článků v podobě titulku a URL každého z nich. O 2 body víc dostanete v případě, že program vypíše pouze ty články, které jsou nové od jeho posledního spuštění. | ||
02.12. | db | 10 | Napište program, který bude do CSV souboru ukládat informace o souborech na disku.
Může být spuštěný s --index cesta, v tom případě uloží do databáze informace
o všech souborech na této cestě, případně, pokud už tam jsou, je aktualizuje (včetně
smazání informací o souborech, které byly smazané). Spuštěný může být také s jinými
parametry (ty si vhodně dodefinujte), s kterými v databázi vyhledá a vypíše (podmínky
je možné libovolně kombinovat):
| ||
02.12. | chat | 9 | Napište jednoduchý chatovací server. Když se k němu uživatel poprvé připojí, zeptá se ho
na jméno, a až se uživatel představí, vypíše mu seznam přítomných. Poté je možné serveru
posílat zprávy, které prefixované jménem odesílatele chodí všem přítomným. Pro plný počet bodů byste měli důsledně ošetřovat možné chyby. | ||
20.01. | 30. 9. 2015 :) | perl6 | ? | Napište libovolný z předchozích úkolů, vyjma Eukleidova algoritmu, v Perlu 6. Maximální počet bodů bude stejný jako maximální počet bodů původního úkolu. | |
20.01. | 30. 9. 2015 :) | perlc | 10 | Napište program v C, který jako argument dostane jméno souboru a na standardním vstupu dostane „TSV (tab separated values)“. V souboru bude definice perlí funkce, nechť se tato funkce jmenuje modify. Program zpracovává vstupní TSV po řádcích, vždy řádek na tabulátorech rozdělí na jednotlivé prvky. Ty pak jako pole předá oné perlí funkci, která pole nějak zpracuje. Pokud funkce vrátí prázdné pole, řádek se ignoruje, jinak se prvky vráceného pole vypíšou jako řádek na standardní výstup, oddělené opět tabulátory. |
Organizační věci
Docházka na hodiny je nepovinná, ale v případě problémů může být polehčující okolností. Účast na přednášce považujeme za důležitější než účast na cvičení.
Zápočet se primárně uděluje za vypracování domácích úkolů, zkouška za prokázání znalosti Perlu.
Co by vás mohlo zajímat ohledně domácích úkolů…
- Každý týden zadáme 1–2 úkoly.
- Body potřebné na zápočet by měly jít nasbírat splněním cca 6 úkolů za celý semestr.
- Termín vypracování úkolu je následující týden v neděli (resp. ještě další pondělí ve 4 ráno).
- Úkoly se odevzdávají e-mailem na perl@ucw.cz.
- Odevzdává se přímo kód v Perlu, buď jako jediný obsah e-mailu, nebo jako jeho příloha.
- Úkoly nejsou opravované automaticky, ale ručně.
- Hodnotí se nejen správnost, ale i styl.
- Do termínu odevzdání je možné zasílat opravy, a to i po ohodnocení.
- Správná řešení úkolů se budou probírat na cvičení hned po termínu odevzdání.
- Chybějící úkoly je možné nahradit zápočtovým programem – jeho rozsah a termín jsou věcí individuální dohody.
… a co ke zkoušce
- Očekáváme, že při zkoušce budete mít zápočet. Budete-li mít dobrou výmluvu, proč ho nemít, ozvěte se.
- U zkoušky bude třeba 1 program napsat, 1 přečíst.
- Nejprve se bude psát řešení zadaného problému, pak budou individuální obhajoby; při nich budete mít za úkol jednak obhájit svůj program, jednak pochopit, co a proč dělá program předložený námi.
Přesnější pravidla ke zkoušce
Pravidla se nesnaží být vyčerpávající definicí. Jsme v Perlu, používejme selský rozum.
- Při skládání zkoušky byste měli mít zápočet (ne nutně zapsaný, to typicky zařídíme až při zkoušce). Pokud na něj zatím nemáte nárok, řešte to předem. Pět minut před zadáním zkoušky nesplňuje definici předem.
- Psát byste měli v Perlu 5.
- Program se píše na papír. Nebudeme ho přepisovat do počítače ke spolehlivému odhalení syntaktických chyb, ale do těch, kterých si sami všimneme, si možná rýpneme, a větší množství syntaktických chyb vám může zhoršit známku.
- Bez obav smíte využít všechny základní funkce a moduly probrané na přednáškách nebo cvičeních. Použití jiných modulů s námi raději předem konzultujte.
- Během celé zkoušky bude k dispozici počítač s perldoc-em.
- Během zkoušky je povoleno ptát se [zkoušejících, nikoliv kolegů] na otázky typu „Jak v Perlu udělat to a to?“. Neslibujeme nic o tom, jak moc užitečnou odpověď dostanete, typicky to bude více či méně konkrétní nasměrování do perldoc-u.
- O napsaném kódu si s vámi budeme chtít popovídat. Může nás zajímat, proč něco děláte zrovna tak, zda byste to uměli jinak, jakou má vaše řešení složitost.
- Kód k pochopení bude mít několik řádek a může být i v Perlu 6.