- 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 -