Perl

programovací jazyk
Tento článek je o programovacím jazyku. O typografické jednotce perl pojednává článek typografický bod.

Perl (výslovnost [purl] či [pɜːl]IPA)[5] 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
Paradigmamultiparadigmatický: funkcionální, imperativní, objektově orientovaný, reflexní, generický
Vznik18. prosince 1987
AutorLarry Wall
VývojářLarry Wall
Poslední verze5.36.0 (28. května 2022[1])
5.34.1 (13. března 2022[2])
5.32.1 (23. ledna 2021[3])
Poslední nestabilní verze5.37.6 (20. listopadu 2022[4])
Typová kontroladynamická
Ovlivněn jazykyAWK, Smalltalk 80, Lisp, C, C++, sed, Unix shell, Pascal
Ovlivnil jazykyPython, PHP, Ruby, ECMAScript, Dao, Windows PowerShell, JavaScript, Falcon
OSmultiplatformní
LicenceGNU GPL, Artistic License
Webperl.org

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“ (anglicky there's more than one way to do it). 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).[6]

Výhody Perlu

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

editovat
  • 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()[7]

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

editovat

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

editovat

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

editovat

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.[8]

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

Reference

editovat
  1. nntp.perl.org. perl 5.36.0 is now available [online]. 2022-05-28 [cit. 2022-12-13]. Dostupné online. (anglicky) 
  2. nntp.perl.org. Perl 5.34.1 is now available! [online]. 2022-03-13 [cit. 2022-12-13]. Dostupné online. (anglicky) 
  3. nntp.perl.org. Perl 5.32.1 is now available! [online]. 2021-01-23 [cit. 2021-10-13]. Dostupné online. (anglicky) 
  4. nntp.perl.org. Perl 5.37.6 has been released [online]. 2022-11-20 [cit. 2022-12-13]. Dostupné online. (anglicky) 
  5. Define Perl at Dictionary.com [online]. Dictionary.com, LLC [cit. 2018-06-02]. Dostupné online. (anglicky) 
  6. WALL, Larry; SCHWARTZ, Randal L.; CHRISTIANSEN, Tom. Programming Perl. Příprava vydání Steve Talbott. 1. vyd. Beijing, Cambridge, Farnham, Köln, Paris, Sebastopol, Taipei, Tokyo: O'Reilly, 9. 1996. xxi, 645 s. (Druhá edice). Dostupné online. ISBN 1-56592-149-6. OCLC 35663387 Kapitola Preface, s. 13. (anglicky) 
  7. KRČMÁŘ, Petr. Chyby v programovacích jazycích ohrožují bezpečnost aplikací. Root.cz [online]. Internet Info, s.r.o., 12. 12. 2017 [cit. 6.1.2018]. Powered by Linux. Dostupné online. ISSN 1212-8309. 
  8. Obfuscated Perl Program (Perl Paraphernalia, perl.plover.com)

Literatura

editovat
  • WALL, Larry; SCHWARTZ, Randal L.; CHRISTIANSEN, Tom. Programování v jazyce Perl (původním názvem: Programming Perl). Překlad Martin Blažík; Editor ing. Martina Mojzesová; Odborná korektura ing. Bohumil Michal; Jazyková korektura Josef Novák. 1. vyd. Praha: Computer Press, 1997. 683 s. ISBN 80-85896-95-8. Pozn. o autorech. 
  • SRINIVASAN, Sriram. Programování v Perlu pro pokročilé: základy a techniky pro vývojáře (původním názvem: Advanced Perl programing). Překlad Martin Blažík; Editor Ivo Magera; Jazyková korektura Libor Vyhnálek. 1. vyd. Praha: Computer Press, 1998. 412 s. ISBN 80-7226-079-0. 
  • LEMAY, Laura. Naučte se Perl za 21 dní (původním názvem: Teach yourself Perl in 21 days). Překlad Bogdan Kiszka a Jaroslav Černý; Jazyková korektura Eva Bublová; Odpovědný redaktor Ivo Magera; Technický redaktor Jiří Matoušek. 1. vyd. Praha: Computer Press, 2002. 546 s. (Rychle a jistě. Internet). ISBN 80-7226-616-0. Přeloženo z angličtiny. 
  • KYSELA, Martin. Perl: kompletní kapesní průvodce programátora. Odpovědný redaktor Miroslav Lochman. 1. vyd. Praha: Grada, 2005. 134 s. ISBN 80-247-1170-2. 
  • DAŘENA, František. Myslíme v jazyku PERL. Odpovědný redaktor Miroslav Lochman. 1. vyd. Praha: Grada, 2005. 700 s. (Knihovna programátora). ISBN 80-247-1147-8. Obsahuje bibliografii, bibliografické odkazy a rejstřík. 

Externí odkazy

editovat

Články a učebnice:

Související projekty:

  • (anglicky) gtk2-perl – psaní GUI aplikací v Perlu nad GTK2
  • (anglicky) wxPerl – psaní GUI aplikací v Perlu pomocí wxWidgets