adelton

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:

  1. Základní Perlovské moduly, rozšíření jazyka Perl a nástroje pro tvorbu dokumentace
  2. Vývojové nástroje
  3. Rozhraní k operačním systémům
  4. Sítě a síťování, meziprocesová komunikace
  5. Datové typy a nástroje pro práci s nimi
  6. Databázová rozhraní
  7. Uživatelská rozhraní
  8. Rozhraní a emulace jiných programovacích jazyků
  9. Soubory, filesystémy, zamykání souborů
  10. Zpracování řetězců, textů, parsování, hledání
  11. Zpracování parametrů příkazové řádky a konfiguračních souborů
  12. Internacionalizace a lokalizace
  13. Autentikace, bezpečnost a kryptování
  14. World Wide Web, HTML, HTTP, CGI, MIME
  15. Nástroje pro tvorbu serverů a daemonů
  16. Archivace, komprese, konverze
  17. Obrázky, kreslení a grafika
  18. Pošta a Usenet news
  19. Řízení výpočtu (zpětná volání a zpracování výjimek)
  20. Filehandly a vstupně/výstupní proudy
  21. MS Windows
  22. 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 im); 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.