CPAN -- Comprehensive Perl Archive Network
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
On the Internet, nobody knows you're a dog.
-- Cartoon caption
Jan Pazdziora, 8. prosince 1997
Perl, jazyk na zpracování textů, správu systému či přístup
k databázím, má mnoho možností a funkcí již ze své definice, velice
významná je ale možnost použít moduly, které řeší přímo náš úkol,
nebo je jen stačí patřičným způsobem rozšířit. Všechny volně
dostupné moduly, spolu s Perlovskými distribucemi a dokumentací,
jsou shromážděny na CPANu, archívu mirrorovaném na mnoha serverech
světa. Tento příspěvek přiblíží obsah archívu a také naznačí,
které úkoly se v Perlu řeší tak často, že pro ně existují již hotová
řešení.
Kde je CPAN
Vstupním bodem k CPANu je URL http://www.perl.com/CPAN/,
které nás přesměruje k nejbližšímu mirroru. Pokud s defaultním
přesměrováním nejsme spokojeni, můžeme odstranit poslední lomítko
a vybrat si nejvhodnější server ručně. Na TEN-34-CZ je možno zamířit
například na mirror http://www.fi.muni.cz/ftp/pub/cpan.
Kategorie modulů
Mnoho z úkolů, které se chystáme v Perlu udělat, už
pravděpodobně dělal někdo před námi. Soubor
modules/00modlist.long.html
obsahuje jednak obšírný úvod do problematiky, tedy například i
informaci o tom, co to vlastně modul je, jednak seznam existujících
modulů, rozdělený na části podle zaměření a se stručnými komentáři
ke každému modulu.
Uveďme zde skupiny, do.nichž jsou moduly neformálně roztříděny:
- základní Perlovské moduly, rozšíření jazyka Perl a nástroje pro
tvorbu dokumentace
- vývojové nástroje
- rozhraní k operačním systémům
- sítě a síťování, meziprocesová komunikace
- datové typy a nástroje pro práci s nimi
- databázová rozhraní
- uživatelská rozhraní
- rozhraní a emulace jiných programovacích jazyků
- soubory, filesystémy, zamykání souborů
- zpracování řetězců, textů, parsování, hledání
- zpracování parametrů příkazové řádky a konfiguračních souborů
- internacionalizace a lokalizace
- autentikace, bezpečnost a kryptování
- World Wide Web, HTML, HTTP, CGI, MIME
- nástroje pro tvorbu serverů a daemonů
- archivace, komprese, konverze
- obrázky, kreslení a grafika
- pošta a Usenet news
- řízení výpočtu (zpětná volání a zpracování výjimek)
- filehandly a vstupně/výstupní proudy
- MS Windows
- různé
Další obsah CPANu
Kromě modulů najdeme na CPANu jednak zdrojové distribuce Perlu
samotného v podadresáři src, jednak dokumentaci k Perlu včetně FAQ v
adresáři doc. Snad stojí zato upozornit například na doc/perlref-*,
což je vysázená referenční příručka v tom formátu, v jakém ji
prodává nakladatelství O'Reilly, nebo podadresář doc/FMTEYEWTK, Far
More Than Everything You Ever Wanted To Know.
Při hledání řešení na CPANu může pomoci také vyhledávání na URL
http://theory.uwinnipeg.ca/search/cpan-search.html s nejrůznějšími
kritérii hledání.
Distribuce modulů
Každý modul či balík modulů je šířen jako archív (buď .tar.gz
nebo .zip) a je umístěn v adresáři svého autora. Adresáře autorů
jsou v podadresáři authors a odkazy většinou jdou přes author/ids
s krátkou identifikací každého člověka. Součástí názvu bývá
číslo verze a pokud distribuce obsahuje README, je toto na CPANu
automaticky dostupné vedle daného archívu.
Jak instalovat
Tar rozbalíme, přepneme se do vytvořeného adresáře a spustíme
perl Makefile.PL
make
make test
make install
samozřejmě pokud předchozí fáze proběhly v pořádku. Prvním
bodem by jistě mohla být četba dokumentace a doporučení k instalaci,
ale kdo čte manuály, pokud nejsou žádné problémy, že ;-) Příkaz
perl Makefile.PL vytvoří Makefile, který je nadále svázán (cestami
a voláním perlu) s tím interpretem, který byl volán na .PL.
Můžeme tedy mít na disku více verzí Perlu a Makefile.PL zajistí,
že instalujeme moduly k té správné.
Pokud se objeví problémy, je vhodné si přečíst návod,
zda jsme neměli nastavit nějakou proměnnou prostředí (kupříkladu
\ORACLE\_HOME) či se na instalaci mnohdy předcházenou kompilací
jinak připravit. Pokud dojde k chybě až při testech, je možné je
pustit znovu jako
make test TEST_VERBOSE=1
což nám může pomoci vyhledat chybu na naší straně.
Pokud jsme si jisti, že chyba není u nás, je vhodné poslat
podrobný popis chyby spolu s verzemi Perlu a modulu autorovi, resp.
osobě či mailing-listu zodpovědnému za údržbu. Reakce je většinou
velmi rychlá -- pokud o chybě informujeme, máme naději na její
rychlé odstranění, pokud ne, nemáme si nač stěžovat.
Automatická instalace
S distribucí Perlu přichází i modul CPAN, který zjednodušuje
instalace a upgrade nových verzí modulů na našem lokálním stroji.
Nejjednodušší spuštění
perl -MCPAN -e shell
nám nabídne interaktivní prompt, který dovoluje: vyhledávat
moduly na CPANu a porovnávat jejich verze s verzemi instalovanými,
volby (i a m); najít moduly, které mají na CPANu vyšší číslo
verze (volba r); spustit instalaci (install), která ale proběhne
jen pokud byl v pořádku jak make, tak make test; vytvořit seznam
nainstalovaných modulů, abychom pak na jiném stroji či jiné
platformě byli schopni rychle nainstalovat stejnou konfiguraci
(autobundle, recompile).
Modul CPAN při instalaci modulu zajistí stažení distribuce z
námi zvoleného CPAN mirroru, přičemž použije buď externí programy
nebo knihovnu LWP. Porovná kontrolní součet .taru, rozbalí ho a pak
provede posloupnost výše uvedených instalačních kroků. Parametry
fungování tohoto správce instalace jsou uloženy na disku, takže se
po jeho ukončení neztrácejí.
Dokumentace
Perl podporuje dokumentaci přímo v souboru modulu ve formátu
POD (Plain Old Documentation). Při instalaci je tato dokumentace
automaticky přeformátována do podoby manových stránek a ty jsou
nainstalovány spolu s vlastním kódem modulů. Dokumentace je tedy
on-line dostupná i poté, co jsme distribuční balík v zájmu šetření
místem z disku smazali.
CGI, MIME
Jednou z oblastí, kde je popularita Perlu velice vidět, jsou
CGI skripty, neboť množství systémových funkcí spolu s regulárními
výrazy a textovými funkcemi dávají možnost rychle se dobrat
požadovaného cíle. Obraty jako
s/%([0-9a-fA-F]{2})/pack("c",hex(1))/ge;
jsou rychlé a efektivní. Ovšem dělat po dvacáté tu samou věc
rychle omrzí, a proto existuje například modul CGI, který objektovým
způsobem nabízí většinu funkcí pro zpracování vstupu všemi HTTP
metodami, manipulaci s předanými parametry i tvorbu například HTML
odpovědi. Výhodou je jednak čisté řešení, jednak jistá záruka,
že kód vyvíjený a podporovaný Perlovskou komunitou se chová podle
psaných i nepsaných standardů a pamatuje i na neobvyklé situace.
Typický skript pak může být
use CGI;
my q = new CGI; # načte vstup
if (q->>param('name') and # test parametrů
q->>remote_user() eq allow) {
print q->>header(
-type=>>'text/html; charset=iso-8859-2',
-expires=>>'+3d'); # odpověď
print q->>start_html(-title=>>' ...
\end{verbatim}
Podobně například pro práci s MIME formáty je pravděpodobně
lepší přímo použít prověřený modul, například MIME::Base64 či
MIME::Decoder, než opakovaně vyvíjet obdobný kód. Volnost Perlu jak
v otázce typů, tak například při práci s velkými objemy dat, nám
vždy dovoluje obrátit se v případě nutnosti na standardní Perlovské
prostředky, kterými uděláme rychle potřebné, a pouze pro rutinní
části skriptu použijeme funkce z modulu.
Z CGI a HTML tedy snadno odskočíme k modulu GD, kterým v
reálném čase nakreslíme .gif a ten pošleme spolu s HTTP hlavičkami
na výstup, případně si můžeme například tvorbu grafů zjednodušit
nadstavbou nad GD, modulem GIFgraph. Nebo můžeme pomocí Mail::Folder
procházet archív diskusní skupiny a pro přibližné vyhledání
použijeme buď regulární výraz či některý z modulů Text::.
LWP, Net
Na úrovni přístupu někam po síti pracují moduly Net::, kde za
dvojtečkou jsou jména protokolů jako FTP, Time či
NNTP. Při jejich použití opět vytvoříme konstruktorem objekt a k
němu voláme metody, které se promítají na odpovídající akce
použitého protokolu, například
use Net::NNTP;
my nntp = new Net::NNTP;
my group = 'comp.lang.perl.misc';
my @gr;
if (@gr = nntp->>group(group)) {
Nad protokolem HTTP jsou postaveny moduly LWP::, Library for WWW
access in Perl. Poskytují několik úrovní složitosti (a možností),
od jednoduchého
perl -MLWP::Simple -e \
'getprint "http://www.perl.com/"'
přes třídu HTTP::Request až po široce konfigurovatelný
LWP::UserAgent.
Databáze
Přístup k databázovým strojům z Perlu se v poslední době stává
velmi rozšířenou aplikací. Existuje specifikace rozhraní a modul DBI
(database interface), které definuje skupinu metod pro připojení k
databázi, zaslání SQL dotazu a čtení odpovědi. Pro všechny hlavní
databáze pak existují databázové ovladače, DBD::, které převádí tato
unifikovaná volání na.volání API jednotlivých databází.
Příklad použití
use DBI;
my dbh = DBI->>connect("dbi:Oracle:prod",
user, pass)
or die DBI::errstr;
my sth = dbh->>prepare("insert into cust
values (?, ?, ?)")
or die dbh->>errstr();
následované provedením příkazu. Takto psaný program je
přenesitelný pod jinou databázi pouhou změnou parametru ve volání
connect. Protože ale je více než jeden způsob, jak věci dělat,
můžeme samozřejmě používat i nestandardní rozšíření definovaná
databází a ovladačem, která mohou být rychlejší, ale také
neportabilní.
Jádro většiny ovladačů je psáno v jazyce C a pro jeho kompilaci
je nutná alespoň minimální část vývojového prostředí k dané
databázi. Vždy je nutné přečíst si README, kde jsou požadavky pro
instalaci konkrétního ovladače vyjmenovány.
Jeden z velmi zajímavých ovladačů je DBD::pNET, který funguje
jako proxy pro přístup k databázi na vzdáleném stroji. Mějme
například Informix na Solarisu, s vývojovým prostředím, k němuž
chceme přistupovat z Linuxového stroje. Informix pro Linux nemáme,
a proto nemůžeme zkompilovat driver na Linuxu a použít přímo
síťovou podporu databáze (navíc mnohdy za speciální peníze). Můžeme
ale zkompilovat DBD na Solarisu a spustit na něm tzv. pNETagenta,
daemona, který požadavky přicházející z Linuxového stroje pošle
databázi a zpět zprostředkuje výsledky. Přenos dat je možno mít
kryptovaný a přístup povolený například jen pro konkrétní stroje.
výheň