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ů. Můžete sledovat počty bodů za úkoly.

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řidání prvku na začátek seznamu
  • Přidání prvku na konec seznamu
  • Přidání prvku za zadaný prvek
  • Smazání zadaného prvku
  • Vrácení reference na první prvek
  • Vrácení reference na poslední prvek
  • Výpis hodnot všech prvků v seznamu
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:
  • Do délky programu se počítají všechny ne-witespace-ové znaky.
  • Odevzdaný program smí obsahovat pouze definici funkce, nic jiného (tedy žádné use, žádná globální pole atp.).
  • Vstupem funkce bude vždy řetězec velkých písmen [IVXLCDM] představující korektní zápis čísla římskými číslicemi. Korektní zápis v tomto případě zejména znamená:
    • Odečítat se smí pouze jednou, a pouze u dvojic IV, IX, XL, XC, CD, CM.
    • Odečítat se smí až od poslední číslice dané hodnoty, tj. XIX se smí, IXX ne.
    Platná čísla tedy jsou třeba I, IX, MCMXLIV, MMXIV.
  • Výstupem funkce musí být číslo (se správnou hodnotou).
  • Funkci musí být možné zavolat vícekrát (a vždy musí dát správný výsledek).
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. 14.12. 30. 9. 2015 :) 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. 14.12. 30. 9. 2015 :) 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):
  • soubor daného jména (předpokládejte přesnou shodu),
  • soubor menší než zadaná velikost,
  • soubor větší než zadaná velikost.
Pro plný počet bodů byste měli soubory zpracovávat rozumně efektivně.
02.12. 14.12. 30. 9. 2015 :) 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ů…

… a co ke zkoušce

Přesnější pravidla ke zkoušce

Pravidla se nesnaží být vyčerpávající definicí. Jsme v Perlu, používejme selský rozum.