Perl

Perl (výslovnost [purl] či ) 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 Magazine 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“ (). Umožňuje psát krátké programy jednoduše a rychle a přitom 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 sebevědomý (Laziness, Impatience and Hubris).

Výhody Perlu 
 výhody „interpretovaného“ jazyka, především rychlý vývoj bez nutnosti kompilace a linkování – program je zkompilován po každém spuštění a je kdykoli možné „přikompilovat“ další kód. Je možno i provést část kódu před kompilací zbytku a nastavit tak konstanty, které následně může využít optimalizační část kompilace. A například vynechat kód pro ladicí výpisy, pokud není program spuštěn s určitým parametrem.
 přes 18 000 volně dostupných modulů třetích stran v Comprehensive Perl Archive Network CPAN. Pojmenování, kategorizace, dokumentace, testování a instalace modulů jsou standardizovány. Moduly zpřístupňují prakticky veškerá dostupná rozhraní a knihovny.
 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
 automatická práce s pamětí (není třeba explicitně alokovat a uvolňovat paměť) a pokročilé datové typy např. asociativní pole neboli hash (lineární seznamy a binární stromy již nejsou třeba)
 Perl 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, AWK, sed, sh, BASIC, funkcionální jazyky (uzávěry, funkce jako parametry nebo návratové hodnoty, …) a dalších
 reference na statické, dynamické i anonymní datové struktury
 umožňuje procedurální, funkcioná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)
 dynamické volání procedur (název známe až za běhu programu)
 stabilita – mnoho let vyvíjený programovací jazyk
 možnost použití inline C/C++ v Perlu nebo rozhraní Perlu pro externí C/C++ knihovny skrz XS nebo SWIG
 uzávěry (podprogramy si pamatují proměnné, jež potřebují 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)
 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>
 rozsáhlá dokumentace a literatura, komunita kolem Perlu, konference, news…

Nevýhody Perlu 
 nedisciplinovaný programátor může extrémně snadno vytvářet nesrozumitelný kód (jazyk velice benevolentní)
 při některých aplikacích se může projevit neefektivnost dynamicky typovaného jazyka ve srovnání se staticky typovanými jazyky, zejména spotřeba paměti
 kruhové odkazy a problematika jejich destrukce (použití reference counting garbage collectoru vyžaduje použití destruktorů, které přeruší kruh nebo používání weak [wiːk] referencí, které nezvyšují hodnotu čítače referencí)
 mnozí tvrdí, že jde o jazyk nevhodný pro výuku programování, ostatním use strict;. Při použití ve výuce hrozí, že si student zvykne, že se o spoustu věcí nemusí starat a přechod na nižší jazyk pak bolí
 syntaxe perlu 5 je tak složitá, že neexistuje samostatný parser ani formální definice syntaxe jazyka; jediný parser perlu řady 5 je samotný interpret perlu, ani programátorské editory Vim a Emacs neumí pro perl korektně zvýrazňovat syntaxi
 jazyk obsahuje funkce typu typemap, která dovoluje provést kód stejně jako funkce eval()

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 6). 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.

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 výchozí 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) { 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 do verze 5.20 (květen 2014) neumožňoval tradiční způsob předání parametrů funkci. Hodnoty předávané při volání funkce jsou uloženy v poli @_ a programátor si musel sám zkontrolovat kolik a jakých parametrů funkce dostala a uložit si je do lokálních proměnných. Samozřejmě existují knihovny, s jejichž pomocí je možné nadeklarovat validaci, výchozí hodnoty a podobně.

Práce s proměnnými je v Perlu poněkud odlišná od kompilovaný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 VŽDY skalární hodnotou, umístíme před
                    # název proměnné symbol $
@pole[0,2] = (7,9); # v případě, že přistupujeme k několika prvkům
                    #  najednou 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í
print join( ', ', @skoly{'pavel', 'petr'});
                    # vypíše: FI MUNI, FIT VUT
                    # hodnota je opět seznam

Krása Perlu 
Larry Wall považuje sám sebe za umělce a Perl za umělecké dílo.
Následující program slouží jako malá ukázka, čeho je tento jazyk schopen. Program vypíše (záměrně) 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

Toto samozřejmě není doporučený ani obvyklý způsob zápisu programů v Perlu, ale pouze ukázka schválně neoptimálního kódu.

Literatura

Reference

Externí odkazy 
 
 
  CPAN.org – bohatá kolekce software, modulů, skriptů a dokumentace
  metacpan.org – bohatá kolekce software, modulů, skriptů a dokumentace
  české stránky o Perl6
Články a učebnice:
  seriál Perličky na Root.cz
  seriál Regulární výrazy na Root.cz
Související projekty:
  gtk2-perl – psaní GUI aplikací v Perlu nad GTK2
  wxPerl – psaní GUI aplikací v Perlu pomocí wxWidgets

 
Dynamicky typované programovací jazyky
Skriptovací jazyky
Svobodný software
Objektově orientované programovací jazyky
Unixové programátorské nástroje