B::Cool

Pre každého pojem cool alebo čo to znamená byť zaujímavý znemaná niečo iné. Rovnako keď chceme zaujať musíme vedieť čím. Asi by sme naše staré mamy neočarili ukážkami z live koncertu Metalicky, na druhú stranu snažiť sa zaujať tínedžera s operetou tiež nebude veľmy úspešné.

Preto sú nasledujúce cool veci týkajúce sa programovacieho jazyka Perl usporiadané podľa zamerania.

Čo ponúka Perl pre:

pre Bežného IT konzumenta

V programovacom jazyku Perl bolo napísaných veľké množstvo úspešných projektov, možno používate práve jeden z nich:

Zdroj: Mailing list

pre biochemika

Vyšlo v celku hojné množstvo kníh na tému Perl a Bioinformatika:

Existuje tiež BioPerl komunita ktorá vyvíja BioPerl Toolkit, čo je zbierka Perl modulov užitočných pri riešení bioinformatických problémov. BioPerl sa nachádza na http://bioperl.org/.

Zdroj: use.perl.org, bioperl.org, amazon.com

pre filozofa

Respektíve pre toho čo má rád argumenty.

História miluje predstavu osamoteného vynálezcu. História sa mýli. Úspešné firmy sú založené a vedené k úspechu aspoň dvoma a obyčajne viacerými spriaznenými dušami. -Guy Kawasaki

Na slovensku sa hovorí, že - Jedna lastovička jar nerobí. Jeden šikovný človek v tíme nestačí. A čím by sa viacej vystrkoval spomedzi ostatných,tým by bol menej pochopený a menej akceptovaný. Poprípade by nemal nikoho kto by mu vedel oponovať. Čo nie je zdravé ani pre firmu ani pre tím. Ale nájsť niekoho kto je s nami na rovnakej vlnovej dĺžke je veľmi ťažké. Keď sa tak však stane vzniká rezonancia!

Jedna teória hovorí, že všetko tu už bolo. Aj keď je náš vynálezca sám so svojím, ešte neuznaným, nápadom. Nikdy nezačína od nuly, vždy sa opiera o myšlienky a nápady tých, čo skúšali podobné veci pred ním.

Presne túto vlastnosť si najviac cením na programovacom jazyku Perl. Konkrétne na stránke Comprehensive Perl Archive Network sa momentálne nachádza viac ako 14 tisíc univerzálnych riešení problémov od viac ako 6 tisíc autorov z hádam akejkoľvek oblasti - informatika, matematika, chémia, fyzika, ... Netreba vymýšľať vymyslené, riešiť už vyriešené. Poprípade ak máme iný názor na riešenie problému nič nám nebráni sa najskôr poučiť z riešenia iných a potom ukázať svoj prístup. Je to ako mať v tíme 6 tisíc kolegov!

Zdroj: recenzia knihy The Myths of Innovation

pre finančníka

Perl má viac ako 150 modulov pre Finance::, z ktorých je najznámejší Finance::Quote umožňujúci získavať informácie o akciách a o investičných fondoch z rôznych búrz:

Finance::Quote::AEX - Obtain quotes from Amsterdam Euronext eXchange  
Finance::Quote::AIAHK -  
Finance::Quote::ASEGR - Obtain quotes from Athens Stock Exchange.  
Finance::Quote::ASX - Obtain quotes from the Australian Stock Exchange.  
Finance::Quote::BMONesbittBurns - Obtain quotes from the BMO NesbittBurns site  
Finance::Quote::Bourso - Obtain quotes from Boursorama.  
Finance::Quote::Cdnfundlibrary - Obtain mutual fund prices from www.fundlibrary.com  
Finance::Quote::DWS - Obtain quotes from DWS (Deutsche Bank Gruppe).  
Finance::Quote::Deka - Obtain fonds quotes from DekaBank.  
Finance::Quote::FTPortfolios - Obtain unit trust prices from www.ftportfolios.com  
Finance::Quote::Fidelity - Obtain information from Fidelity Investments.  
Finance::Quote::FinanceCanada - Obtain stock and mutual fund prices from finance.canada.com  
Finance::Quote::Fool - Obtain quotes from the Motley Fool web site.  
Finance::Quote::HEX - Obtain quotes from the Helsinki Stock Exchange.  
Finance::Quote::IndiaMutual - Obtain Indian mutual fund prices from amfiindia.com  
Finance::Quote::LeRevenu - Obtain quotes from http://bourse.lerevenu.com.  
Finance::Quote::ManInvestments - Obtain quotes from Man Investments Australia.  
Finance::Quote::NZX - Obtain quotes from NZX (New Zealand stock exchange.)  
Finance::Quote::Platinum - Obtain quotes from the Platinum Asset Management.  
Finance::Quote::SEB - Obtain fund prices from www.seb.se  
Finance::Quote::StockHouseCanada -  
Finance::Quote::TSP - Obtain fund prices for US Federal Government Thrift Savings Plan  
Finance::Quote::Tdefunds - Obtain quotes from TD Waterhouse Efunds  
Finance::Quote::Tdwaterhouse - Obtain quotes from TD Waterhouse Canada  
Finance::Quote::Tiaacref - Obtain quote from TIAA-CREF.  
Finance::Quote::Troweprice - Obtain quotes from T. Rowe Price  
Finance::Quote::Trustnet - Obtain unit trust prices from trustnet.co.uk  
Finance::Quote::USFedBonds - Get US Federal Bond redemption values directly from the treasury at
                             www.publicdebt.treas.gov/sav/savvalue.htm  
Finance::Quote::Union -  
Finance::Quote::UserAgent -  
Finance::Quote::VWD -  
Finance::Quote::Yahoo::Asia - Fetch quotes from Yahoo Asia  
Finance::Quote::Yahoo::Australia - Fetch Australian stock quotes via Yahoo.  
Finance::Quote::Yahoo::Base - Common functions for fetching Yahoo info.  
Finance::Quote::Yahoo::Brasil - Fetch Brasiln stock quotes via Yahoo.  
Finance::Quote::Yahoo::Europe - Fetch quotes from Yahoo Europe  
Finance::Quote::Yahoo::NZ -  
Finance::Quote::Yahoo::USA - Obtain information about stocks and funds in the USA and Canada.  
Finance::Quote::ZA - Obtain South African stock and prices from www.sharenet.co.za  

Tu je príklad ako sa dajú získať informácie z USA o firme "HEWLETT PACKARD C":

perl -MData::Dumper -MFinance::Quote -le '$q = Finance::Quote->new;print Dumper({ $q->fetch("usa","HPQ") });'
Výstup je nasledujúci:
$VAR1 = {
          'HPQ_avg_vol' => '18551800',
          'HPQ_name' => 'HEWLETT PACKARD C',
          'HPQ_div_date' => 'Oct  1',
          'HPQ_success' => 1,
          'HPQ_ask' => undef,
          'HPQ_high' => '45.11',
          'HPQ_time' => '10/3/2008',
          'HPQ_year_range' => '39.99 - 53.48',
          'HPQ_day_range' => '42.62 - 45.11',
          'HPQ_symbol' => 'HPQ',
          'HPQ_last' => '43.00',
          'HPQ_volume' => '25798676',
          'HPQ_currency' => 'USD',
          'HPQ_price' => '43.00',
          'HPQ_pe' => '13.40',
          'HPQ_eps' => '3.228',
          'HPQ_ex_div' => 'Sep  8',
          'HPQ_net' => '-0.26',
          'HPQ_bid' => undef,
          'HPQ_open' => '43.09',
          'HPQ_date' => '00/00/2000',
          'HPQ_div' => '0.32',
          'HPQ_cap' => '105.3B',
          'HPQ_method' => 'yahoo',
          'HPQ_close' => '43.26',
          'HPQ_isodate' => '2000-00-00',
          'HPQ_p_change' => '-0.60',
          'HPQ_div_yield' => '0.74',
          'HPQ_low' => '42.62'
        };

Alebo modul Finance::Currency::Convert::Yahoo ponúka prístup k kurzovému lístku na Yahoo Finance. Tu je príklad ako sa dá zistit koľko je EUR je 100 USD:

perl -MFinance::Currency::Convert::Yahoo -le 'print Finance::Currency::Convert::Yahoo::convert(100,'USD','EUR');'

Výstupom je:

72.55

Zdroj: search.cpan.org

pre Hackera

Pre hackerov je Perl ako ušitý. :-) Perl poskytuje voľnosť ktorú mnohý oceňujú a môžu sa v ňom plne zrealizovať. Nasledujúce bloky sú plne funkčné Perl programy Čo je ostatne vidieť na prvý pohľad (nie?), ale pre istoru to tu spomeniem ;-).

#Erudil from http://www.perlmonks.com/
#!/usr/bin/perl -w                                      # camel code
use strict;
                                           $_='ev
                                       al("seek\040D
           ATA,0,                  0;");foreach(1..3)
       {<DATA>;}my               @camel1hump;my$camel;
  my$Camel  ;while(             <DATA>){$_=sprintf("%-6
9s",$_);my@dromedary           1=split(//);if(defined($
_=<DATA>)){@camel1hum        p=split(//);}while(@dromeda
 ry1){my$camel1hump=0      ;my$CAMEL=3;if(defined($_=shif
        t(@dromedary1    ))&&/\S/){$camel1hump+=1<<$CAMEL;}
       $CAMEL--;if(d   efined($_=shift(@dromedary1))&&/\S/){
      $camel1hump+=1  <<$CAMEL;}$CAMEL--;if(defined($_=shift(
     @camel1hump))&&/\S/){$camel1hump+=1<<$CAMEL;}$CAMEL--;if(
     defined($_=shift(@camel1hump))&&/\S/){$camel1hump+=1<<$CAME
     L;;}$camel.=(split(//,"\040..m`{/J\047\134}L^7FX"))[$camel1h
      ump];}$camel.="\n";}@camel1hump=split(/\n/,$camel);foreach(@
      camel1hump){chomp;$Camel=$_;y/LJF7\173\175`\047/\061\062\063\
      064\065\066\067\070/;y/12345678/JL7F\175\173\047`/;$_=reverse;
       print"$_\040$Camel\n";}foreach(@camel1hump){chomp;$Camel=$_;y
        /LJF7\173\175`\047/12345678/;y/12345678/JL7F\175\173\0 47`/;
         $_=reverse;print"\040$_$Camel\n";}';;s/\s*//g;;eval;   eval
           ("seek\040DATA,0,0;");undef$/;$_=<DATA>;s/\s*//g;(   );;s
             ;^.*_;;;map{eval"print\"$_\"";}/.{4}/g; __DATA__   \124
               \1   50\145\040\165\163\145\040\157\1 46\040\1  41\0
                    40\143\141  \155\145\1 54\040\1   51\155\  141
                    \147\145\0  40\151\156 \040\141    \163\16 3\
                     157\143\   151\141\16  4\151\1     57\156
                     \040\167  \151\164\1   50\040\      120\1
                     45\162\   154\040\15    1\163\      040\14
                     1\040\1   64\162\1      41\144       \145\
                     155\14    1\162\       153\04        0\157
                      \146\     040\11     7\047\         122\1
                      45\15      1\154\1  54\171          \040
                      \046\         012\101\16            3\16
                      3\15           7\143\15             1\14
                      1\16            4\145\163           \054
                     \040            \111\156\14         3\056
                    \040\         125\163\145\14         4\040\
                    167\1        51\164\1  50\0         40\160\
                  145\162                              \155\151
                \163\163                                \151\1
              57\156\056
#!/usr/bin/perl
#Clinton Pierce
#note: Requires 5.6.0 or better

                    '% * % % * % %<>
               * % ~ * % % * % * * % *      *
       * % % * *   % * % *<> * % ~   % % % * %
     *  * * % * % % % % * % % % % % % * % % * %
     % * % % ^ * % % % % *[] % % * * % * * % %  %
      % * %   % % % % % * * % * * @ *   @ % * % %
    % ^ % * % * % * * % % * %  <> % % % % * % %() %
  % % * * * % % * % % * * % * * * * % * * % % * * *
   %   * * * % % * % % *[]<> % % % % * % * * * % % *<>
 % * *  % % % * * % * * * \ * %\ * * *   %/ \ # % * *
  % % % *\ * /\ * *// %  %\ <>\ // % %/ % \// % * %
    * * *\ \|| \ \/ / % %// \ \ *\ /<> %//  %// % %<>
   * % * %\  \  |   | ||// % || //  \// % // * * * %
   %{} %  * ----\   \ | /   %||//   /  ---/ / * % % *
     % *  *\ ____\   \| |    /  /  /   /----/ * %
            \ ----\     |   /   //    /
                   \     \ /        /'
                    =~m/(.*)/s;$_=$1;
                     s![-\\|_/\s]!!g
                       ;%e=('%',0,
                       '^',132918,
                       '~'=>18054,
                       '@'=>19630,
                       '*' =>0b01,
                       '#'=>13099,
                       '[]'=>4278,
                       '<>'=>2307,
                       '{}'=>9814,
                       '()',2076);
                       for $a(keys
                       %e){$e{$a}=
                       sprintf"%b"
                       , $e{$a};}
                     $y= qq{(}.join(
                     '|',map "\Q$_\E"
                   ,keys %e).qq{)};s/$y
              /$e{$1}/gex;print pack"B*",$_;

Ak som niekoho práve vydesil, že toto teda nemôže byť jazyk v ktorom sa dá naprogramovať niečo slušné a tobôž nie na enterprise úrovni tak nech si pozrie sekciu pre manažéra aké nástroje má Perl na to aby udržal jednotný štýl písania zdrojových kódov.

Zdroj: http://www.cpan.org/misc/japh

pre unix administrátora

Unix administrátori vedia, že za mnohými príkazmi v systéme sa skrýva práve Perl.

  • adduser, deluser
  • rsnapshot
  • apt-file
  • dh_* (in Debian)
  • caff
  • git-svn
  • ipcalc
  • svk
  • svnnotify
  • xen-* (xen-tools)
  • atď.

Projekty napísané v Perli:

pre manažéra programátorskéha tímu

Starať sa o tlupu programátorov a uržiavať ich na uzde nieje jednoduchá úloha. Aké nástroje ponúka Perl na to aby sa v ňom efektívne, spolahlivo a tímovo programovalo?

Pri programovaní v Perle nik nieje sám. Bez CPAN-u si už Perl programátori nevedia ani predstaviť svoj život. Nachádza sa tu viac ako 14000 hotových balíčkou (viac ako 900MB skomprimovaných zdrojových kódov) s riešeniami pre rôzne problémy. To je slušný základ kódu na začanie akéhokoľvek projektu.

Rovnako ako sú organizované a inštalované balíčky verejných modulov pre CPAN dajú sa vytvárať, organizovať a inštalovať privátne - vnútro firemné. Spôsob "ako" je štandardný, dobre zavedený a ani nováčikovia čo prídu do tímu s ním nebudú mať problém bez akéhokoľvek školenia.

Štandardná výbava balíčkov je adresár t/ kde sa nachádzajú testy. Tým vďačí Perl za svoju kvalitu. Skôr ako sú moduly z balíčka nainštalované, musia všetky testy prebehnúť bez chyby. Výstupom z testov je takzvaný TAP - Test Anything Protocol. Tu je príklad TAP výstupu:

1..26
ok 1 - validate html/contact.html
not ok 2 - validate html/job.html
#   Failed test 'validate html/job.html'
#   at script/vxml line 80.
# died: html/job.html:68: parser error : xmlParseEntityRef: no name
# <h1>Info & More</h1>
#           ^ at script/vxml line 79
ok 3 - validate html/wien-justin.html
ok 4 - validate html/index.html
ok 5 - validate html/other.html
ok 6 - validate html/links.html
ok 7 - validate html/events.html
ok 8 - validate html/news.rdf
... cut ...
ok 26 - validate html/go/workshop/index.html
# Looks like you failed 1 test of 26.

Existuje niekoľko univerzálnych testov ktoré dávajú pozor na to aby programátor nezabudol na dokumentáciu, poprípade nezačal písať iným štýlom ako je dohodnutý v tíme. Tu sú príklady:

00-compile.t   - prejde všetky zdrojové súbory a zistí či sa dajú zkompilovať
distribution.t - skontroluje či všetky meta súbory balíka sú v poriadku
                 a aktuálne
perlcritic.t   - Test::Perl::Critic prejde všetky zdrojové súbory a 
+perlcriticrc      skontroluje či ich štýl súhlasí so zadefinovanými
+perltidy.conf     pravidlami
pod-coverage.t - skontroluje či všetky funkcie majú dokumentáciu
pod-spell.t    - skontroluje pravopis v dokumentácií
pod.t          - skontroluje formátovanie dokumentácie
signature.t    - skontroluje integritu súborov v balíčku

Tu je na ukážku výstup z perlcritic.t:

t/perlcritic....NOK 1/2#   Failed test 'Test::Perl::Critic for "script/generate-feed.pl"'
#   at /usr/share/perl5/Test/Perl/Critic.pm line 99.
# 
# Perl::Critic found these violations in "script/generate-feed.pl":
# Code is not tidy at line 1, column 1.  See page 33 of PBP.  (Severity: 1)
# Missing "AUTHOR" section in POD at line 1, column 1.  See pages 133,138 of PBP.  (Severity: 2)
# Missing "COPYRIGHT" section in POD at line 1, column 1.  See pages 133,138 of PBP.  (Severity: 2)
# No "VERSION" variable found at line 1, column 1.  See page 404 of PBP.  (Severity: 2)
...

Na objasnenie - Pod je skratka pre "Plain Old Documentation format" čo je spôsob dokumentovania zdrojového kódu pomocou ktorého sa píše dokumentácia zároveň so samotným programom. PBP je skratka pre knihu "Perl Best Practices" ktorá je zbierka doporučení akým štýlom programovať v Perle.

pre Perl programátora

začiatočníka

Asi najdôležitejsie v začiatkoch, je sa vedieť zorientovať. Je pekné mať >62 tisíc modulov, ale keď sa má z nich potom vybrať to užitočné je to trochu problém. Čo by teda nemalo ujsť pozornosti?

  • DBI - Databázovo nezávyslé rozhranie pre Perl. Vďaka tomuto modulu sa môžu Perl programi bežať s rôznymi databázami bez toho aby sa zmenil jediný riadok kódu. Proste sa len zmenia parametre pripojenie. Zoznam podporovaných databáz nekončí pri Oracle, PostgreSQL, MySQL, ODBC, DB2, atď. Abstrakcia taká silná, že sú napísané DBI drivery pre CSV, Excel alebo dokonca .po súbory. Tu je kompletný zoznam DBD:: modulov
  • CGI - "Common Gateway Interface (skrátene CGI) je protokol na prepojenie externých aplikácií s webovým serverom. To webovému serveru umožňuje delegovať požiadavku od klienta na externú aplikáciu, která podľa požadavky vrátí výstup webovému serveru, ktorý pošle výstup ďalej webovému klientovi." -Wikipédia. Vďaka CGI zažil web prerod zo statického obsahu na dynamocký a nemalou mierou sa o to zaslúžil aj CGI Perl modul. Aj dnes v dobe prepracovaných "frejmvórkov" je užitočný ak treba spraviť jednoduchšie interaktívne web stránky.
  • LWP::UserAgent - Web user agent je základ pre mnohé moduly ktoré stoja na druhej strane web-u na strane klienta. Tu je on-liner príklad ako sa dá stiahnuť úvodná stránka z http://ba.pm.org/:
            perl -MLWP::UserAgent -le 'print LWP::UserAgent->new->get("http://ba.pm.org/")->content'
        
  • Test::WWW::Mechanize - modul ktorý práve využíva LWP. Tu je príklad krátkeho (ale kompletného) test skriptu ktorý vie zistiť či je všetko vporiadku na našej stránke:
            #!/usr/bin/perl
    
            use Test::More tests => 5;
            use Test::WWW::Mechanize;
    
            my $mech = Test::WWW::Mechanize->new;
            $mech->get_ok( 'http://ba.pm.org/' );
            $mech->title_is( 'Bratislava Perl Mongers' );
            $mech->content_contains( 'Job' );
            $mech->content_contains( 'Kontakt' );
            $mech->links_ok( 'events.html' );
        
  • Getopt::Long - aby nebolo všetko len ohľadne web-u tu je príklad z rodiny Getopt:: ako sa dá napísať skript čo reaguje na prepínače z príkazového riadku - getoptlong. Pozná '-h' pre help, '-l' obyžajný prepínač, prepínač '-t' s textom ktorý ho musí nasledovať + vypíše zvyšné argumenty ak sú nejaké zadané.
  • GTK2 - a pre priaznivcov GUI tu je príklad "aplikácie" ktorá obsahuje jedno klikatelné tlačítko ktorého funkciou je ju ukončiť :-)
            #!/usr/bin/perl
            use Gtk2 -init;
            my $window = Gtk2::Window->new ('toplevel');
            my $button = Gtk2::Button->new ('Quit');
            $button->signal_connect (clicked => sub { Gtk2->main_quit });
            $window->add ($button);
            $window->show_all;
            Gtk2->main;
        

Žačiatočníkov určite potešia veci čo im uľachčia prácu. Jedna z nich je určite Ack. Štačí nainštalovať App::Ack z CPAN-u a do systému pribudne príkaz `ack` ktorý sa tvári trochu ako grep, ale nieje ním úplne. Ack na predvolené, že vyhľadáva len v súboroch určitých prípon a v niektorých prípadoch obsahu. Pre vyhľadávaní ignoruje napríklad .svn/ adresáre. Pre programátora je to ideálna náhrada príkazu grep.

pokročilého

Pre pokročilých Perl programátorov je tu zbierka krátkych skriptov ktorých autorom je Damian Conway autor knižky Perl Best Practices

  • calc - jednoduchá kalkulačka umožňujúca referovať na predchádzajúce výsledky
  • entar - z-tar-uje niekolko súborov ak treba skomprimuje alebo z-uuencode-uje
  • findword - prehľadá /usr/share/dict/words
  • ruler - v ascii "nakreslí" pravítka
  • uniq - pokročilý príkaz uniq

gurua

Perl guru je cool some o sebe, už nič viac nepotrebuje ;-)

pre Ženu

Celosvetový rožný priemerný plat Perl programátora/programátorky je $68,687 USD. ;-)

~4% ľudí programujúcich v Perle sú ženy.

Ženám sa určite bude páčiť respektíve určite ocenia:

      $LOVE=               AMOUR.
    true.cards.        ecstacy.crush 
  .hon.promise.de    .votion.partners.
 tender.truelovers. treasure.affection.
devotion.care.woo.baby.ardor.romancing.
enthusiasm.fealty.fondness.turtledoves.
lovers.sentiment.worship.sweetling.pure
.attachment.flowers.roses.promise.poem;
 $LOVE=~ s/AMOUR/adore/g; @a=split(//,
  $LOVE); $o.= chr (ord($a[1])+6). chr
   (ord($a[3])+3). $a[16]. $a[5]. chr
    (32). $a[0]. $a[(26+2)]. $a[27].
      $a[5].$a[25]. $a[8].$a[3].chr
        (32).$a[29]. $a[8].$a[3].
          $a[62].chr(32).$a[62].
           $a[2].$a[38].$a[4].
               $a[3].'.';
                 print
                  $o; 

Zdroj: Perl Survey 2007