V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!

Perl

Z Multimediaexpo.cz

Perl je interpretovaný programovací jazyk vytvořený Larry Wallem v roce 1987.
S rozvojem internetu se Perl stal velmi populárním nástrojem pro tvorbu CGI skriptů.

Perl zahájil svou éru jako skriptovací jazyk, náhrada jazyka AWK a interpretru sh. Největšího rozšíření dosáhl ve verzi 4 z roku 1991. Verze 5 přinesla četná vylepšení, především výkonné datové struktury a možnost objektového programování. V poslední době získal Perl oblibu mimo jiné v bioinformatice. PC Magazin zařadil Perl v roce 1998 mezi finalisty soutěže Technical Excellence Award v kategorii Development Tool. Slovo Perl najdete v Oxford English Dictionary.

Larry Wall se při konstrukci jazyka řídil heslem: dá se to udělat více způsoby (there's more than one way to do it). Umožňuje psát krátké programy jednoduše a rychle a přítom nebrání v psaní těch složitých. Jeden ze způsobů je přitom obvykle velmi stručný, takže Perl získal nezaslouženou pověst jazyka, ve kterém se tvoří nesrozumitelný a neudržovatelný kód. Tato kritika ale není oprávněná, Perl je vhodný k řešení malých i velkých problémů. Schopnosti a nástroje, které se používají u velkých projektů, lze použít i v krátkých skriptech.

Dobrý programátor má podle Larryho Walla být líný, netrpělivý a arogantní (Laziness, Impatience and Hubris).

Obsah

Výhody Perlu

  • výhody interpretovaného jazyka, především rychlý vývoj bez nutnosti kompilace a linkování
  • přes 4000 volně dostupných modulů třetích stran skrz Comprehensive Perl Archive Network CPAN. Pojmenování, kategorizace, dokumentace, testování a instalace modulů jsou standardizovány. Moduly zpřístuňují prakticky veškerá dostupná rozhraní a knihovny. Např. rozhraní Perlu pro databáze (DBI) podporuje databáze Oracle, Sybase, PostgreSQL, MySQL, SQLite a modul CGI.pm umožňuje lehce pracovat s HTML formuláři.
  • dokumentace a literatura, komunita okolo Perlu, konference, news…
  • efektivita programování: v programech, které nejsou přímo závislé na rychlosti běhu, je výhodnější jazyk, který vyžaduje méně řádek kódu
  • dynamická práce s pamětí (není třeba destruktorů…) a pokročilé datové typy např. asociativní pole neboli hash (linearní seznamy a binární stromy již nejsou třeba)
  • je svobodný software, licencován pod Artistic License nebo GNU General Public License
  • ve srovnání s kompilovanými jazyky lepší možnosti zabezpečení při běhu kódu
  • snadné spojování již hotových komponent (modulů) stejně jako u Delphi, Visual Basicu, PowerBuilderu, Tcl, Microsoft Office, Emacs, atd. a navíc s možností širokého použití (Linux, Unix, MS Windows, VMS, Palm OS, Apache, ASP, CGI, ISAPI, OLE, WSH, WSC, WxPerl, atd.)
  • převzetí osvědčených konstrukcí z ostatních jazyků, jako např. C (programovací jazyk), AWK, sed, sh, BASIC, a dalších
  • ukazatele na statické, dynamické i anonymní datové struktury
  • umožňuje procedurální i objektově orientované programování
  • snadná práce s textem a značkovacími jazyky (XML, HTML…)
  • regulární výrazy a jejich rychlost
  • Perl podporuje znakovou sadu Unicode a je (byl) Y2K kompatibilní
  • eval (možnost využít funkce překladače za běhu programu, takže můžeme vytvářet dynamický kód, resp. kód optimalizovat na rychlost za běhu)
  • dynamicky volání procedur (název známe až za běhu programu)
  • stabilita: mnoho let mnoha vývojáři vyvíjený programovací jazyk
  • možnost použití inline C (programovací jazyk)/C++ v Perlu nebo rozhraní Perlu pro externí C/C++ knihovny skrz XS nebo SWIG
  • uzávěry (podprogramy si pamatují proměnné jenž potřebuje ke svému běhu)
  • návěstí (řízení cyklů)
  • automatické zavádění (pokud jméno funkce neexistuje pak Perl umožňuje spuštění definovaného kódu)
  • Perl umí zacházet se zakódovanými webovými daty, mezi něž patří transakce u elektronickém obchodování
  • Perl může být součástí web serverů čímž může dojít k zrychlení o 2000 %
  • mod_perl umožňuje web serveru Apache vložení Perlu s výhodami jako je při vložení PHP
  • interpret Perlu může být vložen (embedded) do ostatních systémů, #include <Perl.h>
  • šablony (write)…

Nevýhody Perlu

  • nedisciplinovaný programátor může snadno vytvářet nesrozumitelný kód
  • při některých aplikacích se může projevit neefektivnost interpretru ve srovnání s kompilovanými jazyky, zejména spotřeba paměti
  • adresu odkazů není možno uložit do asociativního pole (hash)
  • kruhové odkazy a problematika jejich destrukce (nutné vytvořit destruktor ručně)
  • mnozí tvrdí že je to jazyk nevhodný pro výuku programování, ostatním stačí 'use strict;'

Budoucí vývoj (Perl 6 a VM Parrot)

V červenci roku 2000, hned po setkání na kterém byl odstartován projekt vývoje jazyka Perl 6, byla započata práce na návrhu virtuálního stroje (VM - Virtual Machine) s názvem Parrot. Parrot je určen pro efektivní běh dynamických programovacích jazyků (primárně pro Perl 5, Perl 6, Python a Ruby). Jádro nové verze jazyka Perl tak bude kompletně přepsáno jako tomu bylo např. u projektu Mozilla. Také syntaxe jazyka se dosti zásadně změní a úplná zpětná kompatibilita bude zaručena jinými prostředky. Allison Randal v rozhovoru z května 2004 předpokládá, že betaverze jazyka Perl 6 se objeví do dvou let.

Ukázka kódu

Tradiční program „Hello world“:

print "hello, world!\n";

Rozšířená verze tradičního programu:

# A sample Perl program
$_ = "Hello, world! The magic number is 234542354.\n";
print;
s/\d+/-1/;
print;

a její výstup:

Hello, world! The magic number is 234542354.
Hello, world! The magic number is -1.

Vysvětlení: print; v podstatě znamená print $_; (kde $_ je defaultní proměnná). s/\d+/-1/; (nebo také $_ =~ s/\d+/-1/;) je regulární výraz, jenž nahradí první nalezenou sekvenci číslic (celé číslo) číslem -1.

Perl je dynamický programovací jazyk. Je možné používat kompilátor v samotném programu. Tady je příklad kalkulačky v jednom řádku kódu:

 while (1) { print eval <>; }

Lze pak zadat například:

 5*5 <ENTER>
 $a = $b = 1; $a+$b <ENTER>
 for (1..1_000_000) { print +($a+$b+$_).„\n“; } <ENTER>
 sin($a)**0.5 <ENTER>

Složitější ukázkou je funkce, která vypíše Fibonacciho posloupnost:

&fib(100);
sub fib {
  my ($a, $b) = (0, 1);
  while ($b < $_[0]) {
    print "$b ";
    ($a, $b) = ($b, $a + $b);
  }
}

Výstupem tohoto programu by bylo:

1 1 2 3 5 8 13 21 34 55 89

Perl neumožňuje tradiční způsob předání parametrů funkci. Hodnoty předávané při volání funkce jsou uloženy v poli @_.

Práce s proměnnými je v Perlu poněkud odlišná od běžných jazyků (C/C++, Pascal):

$prom;  # skalární proměnná
@prom;  # pole
%prom;  # asociativní pole
$pozdrav = "Ahoj";  # skalární proměnná obsahující řetězec znaků
@pole = (1, 2, 3);  # pole o třech prvcích
$pole[1] = 4;       # v případě, že přistupujeme ke konkrétní položce,
                    # která je skalární hodnotou, umístíme před
                    # název proměnné symbol $
%skoly = ("pavel" => "FI MUNI", "petr" => "FIT VUT");
                    # asociativní pole, hodnoty jsou zadávány ve tvaru
                    # klíč => hodnota
print $skoly{"pavel"};
                    # vypíše: FI MUNI
                    # hodnota je opět skalární

Krása perlu

Larry Wall považuje sám sebe za umělce a Perl za umělecké dílo. Následující program [1] slouží jako malá ukázka, čeho je tento jazyk schopen. Program vypíše poměrně pomalu slova: Just another Perl / Unix hacker . Za tím účelem vytvoří 32 paralelních procesů, které složitě synchronizuje pomocí rour.

@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord
($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print


Literatura

Externí odkazy

  • www.perl.org - Oficiální stránka Perlu (anglicky)
  • www.cpan.org - Bohatá kolekce software, modulů, skriptů a dokumentace (anglicky)
  • www.cpan.cz - České stránky o Perlu

Články a učebnice:

Související projekty:

  • gtk2-perl - psaní GUI aplikací v Perlu nad GTK2
  • wxPerl - psaní GUI aplikací v Perlu pomocí wxWidgets