CPAN -- Comprehensive Perl Archive Network
Jan Pazdziora, 1998
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ýznamnou 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/. Na TEN-34-CZ je možno zamířit například na mirror http://www.fi.muni.cz/ftp/pub/perl/.
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://search.cpan.org/ 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 authors/id
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 $query = new CGI; # načte vstup if ($query->param('name') and # test parametrů $query->remote_user() eq $allow) { print $query->header( -type=>'text/html; charset=iso-8859-2', -expires=>'+3d'); # odpověď print $query->start_html(-title=>' ...
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/";' > perl.com.index.html
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 nemuž
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, daemon, 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.
Závěr
Doufám, že tento článek pomůže k lepší orientaci v základním (a jediném ;-) Perlovském archívu a že v něm najdete rozumná řešení pro svou práci i zábavu.