15.
Perl: moduly a objekty
1. Úvod
Tato kapitola z programovacího jazyka Perl pokrývá dělení kódu do modulů, práci s nimi a objektově orientované programování.
Objektově orientované programování se v Perlu realizuje tak, že obyčejnému objektu (poli, asociativnímu poli či skaláru) je přes ukazatel přiřazen modul (třída), který obsahuje metody pro práci s ním. Když pak metodu zavoláte pomocí objektově orientovaného operátoru „->“, Perl ji automaticky najde v modulu, který je k objektu přiřazen (nebo v některém z jeho „rodičů“, jak je modul deklaruje), a při volání funkci vsune použitý ukazatel jako dodatečný parametr na začátku pole @ARG.
2. Definice
- Symbol je identifikátor funkce nebo konstanty nebo identifikátor proměnné včetně rozlišovacího symbolu „$“, „@“ nebo „%“.
- Modul (module) je pojmenovaný kontext pro umísťování funkcí a proměnných, oddělený od hlavního skriptu do samostatného souboru s příponou „.pm“ („Perl module“).
- Hlavní skript je zdrojový soubor, který byl přímo spuštěn interpretem Perlu. Na hlavní skript se při jeho spuštění nabalí moduly odkazované přímo či nepřímo příkazy „use“ a „require“.
- Název modulu je jednoznačné označení modulu, které se skládá z posloupnosti jednoho či více identifikátorů oddělených dvojí dvojtečkou („::“), např. „Digest::MD5“ nebo „English“. V adresářové cestě se pak dvojtečka nahradí za lomítko („/“) a na konec názvu se doplní „.pm“. Na rozdíl od jiných jazyků se název modulu v Perlu nezkracuje (vždy se uvádí celý) a mezi moduly není žádná automatická hierarchie.
- Importovat symbol znamená zpřístupnit symbol z jiného modulu tak, jako by byl definován i v tomto modulu. To umožňuje daný symbol používat bez kvalifikace názvem modulu, případně ho dál exportovat. Importovat lze jen ty symboly, které jsou daným modulem exportovány.
- Exportovat symbol znamená umožnit symbol ostatním modulům z tohoto modulu importovat.
- Objekt je místo paměti, které má svůj datový typ a hodnotu, je to tedy skalár, pole nebo asociativní pole. Objekty se dělí na obyčejné objekty a objekty tříd (jimž byla přiřazena třída).
2/1 Objektově orientované programování
- Jako metoda se označuje funkce použitá objektově orientovaným způsobem (volaná objektově orientovaným operátorem „->“) nebo k tomu uzpůsobená.
- Třída (class) je modul obsahující metody (alespoň jednu). Kromě metod může obsahovat i funkce, které nejsou objektově orientované.
- Rodič třídy je modul (třída) uvedený/á příkazem „use parent“. Není-li požadovaná metoda nalezena v třídě, která je objektu přímo přiřazena, bude ji Perl hledat v jejích rodičích.
3. Zaklínadla
3/1 Obvyklá struktura zdrojových souborů
3/2 Vyhledávání a připojování modulů
3/3 Přístup do modulů
3/4 Třídy a metody
3/5 Třída s pevnou strukturou (deklarace)
3/6 Specializované proměnné
3/7 Zkoumání modulů a objektů
3/8 Zkoumání tříd s pevnou strukturou a jejich objektů
4. Instalace na Ubuntu
Všechny použité nástroje jsou základní součástí Ubuntu, přítomnou i v minimální instalaci.
5. Ukázka
5/1 Hlavní skript (ukázka.pl)
5/2 Modul (Ukázka.pm)
6. Tipy a zkušenosti
- Abyste se vyhnul/a problémům s názvy modulů, každá část názvu musí začínat velkým písmenem a obsahovat alespoň jedno malé písmeno. Např. názvy „Č7á“ nebo „Ay“ jsou vyhovující, názvy „xAb“ či „Z9“ ne.
- Někteří uživatelé příkazem „use lib(".");“ nastavují, aby Perl moduly vyhledával i v aktuálním adresáři. To však není vůbec dobrý nápad, protože aktuální adresář při spuštění skriptu může být zcela nečekaný. Proto doporučuji to nedělat a adresář pro vyhledávání modulů předávat jinak, nejlépe parametrem Perlu -I.
- V Perlu je zvykem nevyužívat výchozí import (proměnnou „@EXPORT“), pokud to nezbytně nepotřebujete. Nechte na uživateli, aby si vybral, které symboly bude chtít importovat.
- Jmenné prostory („package“) lze používat i v rámci jednoho souboru, tato kapitola se ale takovému použití záměrně vyhýbá, protože jsou s ním spojeny problémy — některé příkazy „use“ totiž účinkují na zdrojový soubor (a tedy nebudou účinkovat v tomtéž jmenném prostoru v jiných zdrojových souborech), zatímco jiné účinkují na jmenný prostor (a tedy zase nebudou účinkovat v tomtéž souboru v jiných jmenných prostorech), některé možná kombinují oba účinky.
- Některé moduly používají seznam importovaných symbolů k jiným účelům než jako seznam symbolů, např. k předání nastavení.
7. Další zdroje informací
- Root.cz: Perličky: přetěžování operátorů
- Root.cz: Perličky: pokročilé př. op.
- YouTube: Perl Session 13 (anglicky)
- YouTube: Perl: Packages and Modules (anglicky)
- Dokumentace přetěžování operátorů v Perlu (anglicky)
8. Zákulisí kapitoly
V této verzi kapitoly chybí:
- export/import symbolů po skupinách
Tato kapitola záměrně nepokrývá:
- přetěžování operátorů (jsou s ním komplikované problémy)