- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 01-02/99

Vhodné moduly na CPANu

Milan Šorm, 20. prosince 1999

Tak jako při sestavování počítače nezačínáme vždycky od vodičů a polovodičů, ale od jednotlivých komponent, tak i při programování je vhodné na stále se opakující problémy a úkony použít nějaký již jednou naprogramovaný částečně obecný kód. Perl umožňuje takovýto kód ukládat do tzv. modulů .pm. Takovéto moduly můžeme samozřejmě tvořit sami, mnohem výhodnější je však využít toho, že problémy se často opakují a řada programátorů už něco podobného jistě vytvořila.

Volně šiřitelné moduly pro Perl jsou umísťovány na tzv. CPAN (Comprehensive Perl Archive Network, což je rozsáhlý archiv nejen Perlových modulů. Tento archiv je zrcadlen na mnoha světových serverech, základním je http://www.perl.com/CPAN/, u nás je to např. http://www.fi.muni.cz/ftp/pub/cpan/.

Na CPANu jsou moduly organizovány jednak podle svého názvu, dále podle svého autora, ale také podle kategorie, do které spadají. Navíc řada modulů, které řeší společné téma, mají společný začátek svého názvu - např. Net::Telnet a Net::FTP.

Balíky lze poměrně jednoduše vyhledávat a zainstalovávat pomocí modulu CPAN, který je součástí standardní distribuce. Po zadání příkazu

perl -MCPAN -e shell

lze poměrně jednoduše interaktivně CPAN prohledávat, balíky instalovat příp. upgradovat.

Všechny balíky jsou dokumentované pomocí standardní Perlovské dokumentace ve formátu POD (Plain Old Documentation), která je však jednoduše převeditelná např. na formát unixových manuálových stránek (pod2man) nebo na HTML (pod2html).

CGI

Snad nejznámější a nejpoužívanější je balík CGI, který umožňuje jednoduše realizovat CGI skripty - od zpracování vstupu různými HTTP metodami přes manipulace s formuláři a předanými parametry až po tvorbu HTML odpovědi. Velkou výhodou je řešení, které splňuje definované standardy a výrazné zjednodušení práce (např. zpracování QUERY_STRING apod.).

Jednoduchá ukázka zpracování CGI skriptu může začínat např.

  use CGI;
  my $query = new CGI;
  print $query->header(-type=>'text/html;
        charset=iso-8859-2', -expires=>'+5d');
  print $query->start_html(-title=>' ...
  if ($query->param('ok') and 
    $query->remote_user() =~ /sorm|adelton/) {
    print h1($query->param('name') ...
  } else {
    print $query->startform(-method=>'...
  }

Samozřejmě pro práci s CGI existuje řada dalších modulů, za zmínku stojí např. CGI::Cache, který umožňuje cacheovat výstupy CGI skriptů a tím urychlovat jejich příští zpracování, dále potom pro obsluhu HTTP požadavků různé HTTP::Request, HTTP::Response, HTTP::Cookies až např. komplexní moduly pro výstavbu jednoduchých httpd serverů.

MIME, Mail

Rovněž pro práci s MIME formáty je nejlepší používat modul, který splňuje definované standardy a zapouzdřuje jednotlivé implementační detaily. Jedná se např. o moduly MIME::Base64, MIME::Decoder nebo MIME::QuotedPrint.

Pro práci se poštovními složkami nebo archivy diskusních skupin nám zase poslouží modul Mail::Folder, pro práci s jednotlivými dopisy pak Mail::Internet nebo Mail::Header, pro vlastní odeslání třeba Mail::Mailer nebo Mail::Send.

Vyhledávání a prohledávání pak můžeme realizovat pomocí regulárních výrazů nebo použít nejrůznějších modulů z Text::, které umějí porovnávat řetězce podle nejrůznějších kritérií (např. stejně znějící hlásky jsou zaměnitelné apod.).

Net

Chystáme-li se realizovat program, který bude nucen pracovat se sítí, jistě nám přijdou vhod moduly zabalující jednotlivé nejznámější používané protokoly, jako např. Net::FTP, Net::Telnet apod. Z nejznámějších protokolů jsou realizovány např. DNS, FTP, Ident, NNTP, Ping, Finger, POP3, SMTP, SSL, SNPP (Simple Network Pager Protocol), Telnet, Time, dále pak moduly pro analýzu .netrc či tvorbu démonů spouštěných z inetd.

  use Net::FTP;
  $ftp = Net::FTP->new('ftp.nekde.cz');
  $ftp->login('anonymous','ja@jinde.cz');
  $ftp->cwd('/pub');
  $ftp->get('README');
  $ftp->quit;

LWP, WWW, HTML

Obdobou Net:: modulů pro HTTP protokol je tzv. Library for WWW access in Perl, zkráceně LWP. Skupina modulů LWP:: umožňuje řadu služeb od jednoduchého stažení stránky pomocí LWP::Simple přes různé LWP::RobotUA pro manipulaci s robots.txt po LWP::UserAgent, který umožňuje vytvářet vlastního User-agenta při přístupu k web stránkám.

LWP dokáže spolupracovat např. s Net::SSL pro přístup k dokumentům přes protokol https příp. s Net::FTP apod. Zvládá přístup k autentifikovaným stránkám protokoly Basic i Digest. Pomocí Robot:: lze pak definovat různé vyhledávací či stahovací roboty, jejich výsledky pak lze pomocí HTML::Parse parsovat na jednotlivé hlavičky, tagy, slova apod.

Primitivní prohledávač lokálního uživatelského web prostoru by mohl být složen z části indexovací a vyhledávací. Indexovací část pro slova by vapadala např. takto

  use HTTP::Request;
  use LWP::RobotUA;
  use HTML::LinkExtor;
  sub callback {
    my ($tag,%links) = @_;
    # nějaká úprava $tag (např. jen 'a') a %links
    # zajištění jedinečnosti podle @WAS a @URLS
    push @URLS,$links{href};
  }
  push @URLS,"http://www.nekde.cz/";
  $agent = new 
    LWP::RobotUA('Search!','boss@nekde.cz');
  while ($url = pop @URLS) {
    $url =~ s/(\#|\?).*//g;  push @WAS,$url;
    $parser = 
       HTML::LinkExtor->new(\&callback,$url);
    $request = HTTP::Request('GET',$url);
    $response = $agent->request($request);
    unless ($response->is_error) {
      $content = $response->content;
      $parser->parse($content);  $parser->eof();
      save_words($content,$url);
    }
  }

Pro vlastní evidenci slov pak lze užít opět spoustu modulů, např. HTML::Entities, HTML::TokeParses apod.

Tk, Qt

Plánujeme-li vytvořit v Perlu nějakou interaktivní aplikaci v X, bude nejvhodnější použít některého toolkitu - např. Tk nebo Qt. Nejznámější je právě Tk, které nám umožňuje vytvářet v okénkách nápisy, tlačítka, kreslicí plochy, zaškrtávací a přepínací tlačítka, vstupní položky, rámečky, seznamy, menítka, rolovátka apod.

Těmto jednotlivým komponentám se v Tk říká widgety a skládají se do stromů se vztahem rodič/potomek. Tímto vznikají komplexnější widgety (např. dialogová okna pro standardní operace - otevření souboru apod.).

  use Tk;
  my $main = new MainWindow;
  $main->Label(-text=>'Hello, world')->pack();
  $main->Button(-text=>'OK',
                -command=>\&exit)->pack();
  MainLoop;

V ukázce je nadefinován objekt hlavního okna. Potom je stvořen widget typu text s příslušnými atributy a je umístěn funkcí pack() do hlavního okna. Dále je vytvořeno tlačítko, kterému je nadefinován atribut -command na nějakou uživatelskou funkci, která provede příslušnou akci. Může to být odkaz na funkci nebo anonymní funkce. MainLoop potom spustí hlavní smyčku (vykreslí okno, čeká na události a tyto události vyřizuje voláním jednotlivých akcí).

Standardní součástí distribuce Perl/Tk je aplikace tkweb, která demonstruje použití knihovny Tk při tvorbě webovského prohlížeče.

Databáze - DBI, DBD apod.

Pro přístup k databázím lze užít řadu modulů jako je DBI:: pro práci s SQL dotazy, připojení k databázi apod., dále pak moduly DBD::, což jsou ovladače k nejznámějším databázím - rozhrání mezi API funkcemi databází na unifikované rozhrání DBI.

GD, GIFgraph

Pokud potřebujeme v reálném čase vytvářet obrázky typu image/gif, pak můžeme využít modul GD, který vytváří jednoduchý grafický engine pro jejich tvorbu.

  use GD;
  use GD::Font;
  $text = 'Ahoj, světe.';
  $font_length = gdLargeFont->width;
  $font_height = gdLargeFont->height;
  $x = $font_length * length($text);
  $y = $font_height;
  $image = new GD::Image($x,$y);
  $black = $image->colorAllocate(0,0,0);  # pozadí
  $red = $image->colorAllocate(255,0,0);
  $image->string(gdLargeFont,0,0,$text,$red);
  binmode STDOUT;
  print $image->gif;

Chceme-li zobrazit graf, můžeme samozřejmě rovněž použít modul GD. Daleko výhodnější je však užít GIFgraph, který umí vykreslit čárové, sloupcové, bodové, plošné a koláčové grafy.

Použití modulu je opět jednoduché:

  use GIFgraph::area;
  $graph = new GIFGraph::area(600,300);
  @LABELS = ('I/98','II/98','III/98','IV/98');
  @PROFITS = (1756,1398,1819,1577);
  @COSTS = (1100,800,1200,1000);
  $graph->set(
    x_label => 'kvartály',
    y_label => 'tis. Kč',
    title => 'Celkový graf',
    x_label_skip => 1,
    y_max_value => 2000,
    legend_placement => 'R');
  @data = ( \@LABELS, \@PROFITS, \@COSTS);
  $graph->set_legend('zisky','náklady');
  print $graph->plot(\@data);

Další

Samozřejmě existuje ještě dalších několik tisíc modulů, které umožňují dělat další a další zajímavé věcí - komprimovat a archivovat data, analyzovat DVI, pracovat s PostScriptem, konvertovat češtinu, manipulovat s časem, analyzovat parametry programu, kontrolovat logy, počítat CRC, MD5 apod., zarovnávat text, ovládat terminál, pracovat s OLE pod Windows, měnit uživatelskou quotu, prohledávat slovníky, počítat složité matematické funkce či naopak počítat s velkými čísly, porovnávat soubory, prohledávat diskový prostor a mnoho a mnoho dalšího. *


- předchozí článek - následující článek - obsah - úvodní stránka -