Perl (programmeertaal)
Perl | ||||
---|---|---|---|---|
Paradigma | multi-paradigma | |||
Verschenen | 1987 | |||
Ontworpen door | Larry Wall | |||
Huidige versie | 5.40.0[1] 9 juni 2024 | |||
Typesysteem | Dynamisch | |||
Beïnvloed door | AWK, C, Bourne shell, Lisp | |||
Invloed op | Python, PHP, Windows PowerShell | |||
Besturingssysteem | Multiplatform | |||
Licentie | GNU General Public License, Artistic License | |||
Bestandsextensies | .pl, .pm | |||
Website | (en) Projectpagina | |||
|
Perl is een programmeertaal ontworpen door Larry Wall die eigenschappen van C en UNIX-scripttalen zoals sh en awk in zich verenigt. De naam Perl is geen gewone afkorting, maar een backroniem, dat staat voor Practical Extraction and Report Language.
Mogelijkheden en toepassingen
[bewerken | brontekst bewerken]Perl is geschikt als vervanger van traditionele Unix-shell-scripts, die in sh (de Bourne shell) geschreven worden en daarbij allerlei andere utilities aanroepen zoals sed, tr, uniq, sort, expr en awk; in Perl zijn de benodigde faciliteiten zelf ingebouwd. Bovendien ondersteunt Perl het aanroepen van tal van systeemfuncties (system calls), waarvoor voordien een C -programma geschreven moest worden.
Perl verenigt niet alleen de mogelijkheden van deze talen, maar ook een groot deel van hun manieren van uitdrukken (syntaxis). Daarom wordt het ook wel the Swiss army knife of programming languages (het Zwitsers zakmes onder de programmeertalen) genoemd.
Perl wordt veel gebruikt voor taken waar voordien shell-scripts voor werden gebruikt, voornamelijk het automatiseren van taken in het systeembeheer; daarbuiten wordt het veel gebruikt voor de bewerking van allerlei soorten bestanden (natuurlijke taal, configuratiebestanden, XML- of HTML-documenten, rasterafbeeldingen, enzovoorts). Ook heeft het goede bibliotheken voor allerlei taken, zoals databasetoegang en client/servercommunicatie. Perl wordt veel gebruikt in de bio-informatica. In de jaren 90 was het de meestgebruikte taal voor dynamische websites. Daarna is het op Perl lijkende PHP en vooral Python populairder geworden.
Perl is een scripttaal met uitgebreide mogelijkheden voor reguliere expressies en er kan met Perl object-georiënteerd, procedureel of zelfs functioneel geprogrammeerd worden.
Modules: CPAN
[bewerken | brontekst bewerken]Tot en met versie 4 werd de kracht van Perl steeds uitgebreid door extra voorgedefinieerde functies in te voegen en de taal zelf uit te breiden. Met Perl 5 ontstond CPAN, een over het internet installeerbare verzameling modules die allerhande functionaliteit bieden. Voortaan richtte de belangrijkste ontwikkeling zich op het schrijven van modules, en werd er relatief weinig aan de taal zelf doorontwikkeld. Om CPAN goed te laten functioneren ontstonden allerlei conventies voor het aanbieden, organiseren en ontwikkelen van zulke modules (ondersteund door voor dat doel geschreven Perl-modules) die helpen om de kwaliteit te waarborgen; zo is unittesten standaardpraktijk. Het principe van CPAN is door veel andere talen overgenomen – zo heeft PHP bijvoorbeeld PEAR en PECL, en heeft Python PyPI.
Documentatie
[bewerken | brontekst bewerken]Perl kent naast gewoon commentaar ook een eenvoudige markuptaal, POD, om gestructureerd commentaar te schrijven, vergelijkbaar met bijvoorbeeld Javadoc voor Java en XML-documentatie voor C#. Hiermee wordt code gedocumenteerd; standaard tools kunnen deze documentatie tonen en in andere formaten omzetten zoals man-pagina's of HTML-documenten.
Licentie
[bewerken | brontekst bewerken]Perl is vrije software, uitgebracht onder de Artistic License en GPL. Perl draait op de meeste besturingssystemen. Op de meeste UNIX-achtige systemen, zoals Linux, wordt Perl standaard geïnstalleerd. Ook bestaan er versies voor Windows.
Voorbeelden
[bewerken | brontekst bewerken]Perl is goed geschikt voor het manipuleren van tekstbestanden door middel van korte en bondige opdrachten. In de volgende twee voorbeelden worden tekstbestanden met Perl-oneliners aangepast.
Voorbeeld 1: Converteer file met naam myfile van UNIX- naar DOS-formaat.
perl -i -pe 's/\n/\r\n/' myfile
Voorbeeld 2: Plaats de string "#!/usr/bin/perl" bovenaan iedere file met extensie '.pl'.
perl -i -ple 'print q{#!/usr/bin/perl} if $. == 1; close ARGV if eof' *.pl
Voorbeeld 3: Druk alle regels van de invoer af, maar alleen de eerste keer dat ze voorkomen.
perl -ne 'print unless $seen{$_}++' bestand-met-dubbel-voorkomende-regels
Dit is bijvoorbeeld vaak nuttig om uit logfiles dubbele regels weg te laten.
(De Unix-utility uniq doet dit alleen op gesorteerde invoer.)
In voorbeeld 4 wordt gedemonstreerd hoe er met de uit CPAN afkomstige module LWP (the World Wide Web Library for Perl) een webpagina wordt opgehaald.
Voorbeeld 4: Haal de hoofdpagina van nl.wikipedia.org op.
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
#$ua->proxy("http", "http://ProxyIP:ProxyPort/");
my $response = $ua->get('http://nl.wikipedia.org/'); # haal de hoofdpagina op
if ($response->is_success) {
my $html = $response->content;
print $html; # produceert de hoofdpagina (in HTML)
# alternatief:
#&print_wist_je_dat($html); # zie volgende voorbeeld
} else {
die $response->status_line;
}
Om alleen de weetjes uit de rubriek "Wist je dat..." af te drukken moet een # worden verplaatst van de regel met &print_wist_je_dat naar de regel met print $html; de definitie van print_wist_je_dat kan er dan als volgt uitzien:
Voorbeeld 5: Parse HTML uit de rubriek "Wist je dat...".
use utf8; # liefst bovenaan plaatsen voor de duidelijkheid;
use bytes; # deze twee statements geven aan dat er UTF-8 in het script zit, namelijk het teken …
use HTML::TokeParser;
sub print_wist_je_dat
{
my ($html) = @_;
my $stream = HTML::TokeParser->new( \$html );
my $InListItem = 0;
my $ListItemStr = '';
while (my $token = $stream->get_token) {
if ($token->[0] eq 'T') { # text
if ($InListItem) {
$ListItemStr .= $token->[1];
}
} elsif ($token->[0] eq 'S') { # start-tag
my($tagname, $attr) = @$token[1,2];
if ($tagname eq 'li'){
$InListItem = 1;
}
} elsif ($token->[0] eq 'E') { # end-tag
my $tagname = $token->[1];
if ($tagname eq 'li'){
if ($ListItemStr =~ /^(…|\.{3})/){
print $ListItemStr . "\n";
}
$InListItem = 0;
$ListItemStr = '';
}
}
}
}
Voorbeeld 6: als het vorige, maar dan met de CPAN-module XML::LibXML
:
use utf8; # liefst bovenaan plaatsen
use bytes; # deze zijn voor het matchen van …
use XML::LibXML;
sub print_wist_je_dat
{
my ($html) = @_;
my $parser = new XML::LibXML;
my $root = $parser->parse_html_string($html)->getDocumentElement;
print "$_\n" for
grep { /^(…|\.{3})/ }
map { join('', $_->findvalue( './/text()')) }
$root->findnodes( '//li' );
}
Kritiek op Perl
[bewerken | brontekst bewerken]Een veelgelezen kritiek op Perl is dat de taal onleesbare code in de hand zou werken. Enerzijds door het onorthodoxe en veelvuldige gebruik van speciale tekens, anderzijds door de syntactische vrijheid.
Symboolgebruik
[bewerken | brontekst bewerken]In Perl wordt heel veel gebruikgemaakt van niet-alfanumerieke symbolen met een voorgedefinieerde betekenis zoals <>, $_ en $/ en de speciale tekens in reguliere expressies. Ook worden accolades en haakjes voor veel verschillende dingen gebruikt. Bovendien hebben veel operaties een default-operator die weggelaten mag worden. Deze voorzieningen maken compacte code mogelijk, maar bemoeilijken de leesbaarheid voor degenen die de notaties niet kennen.
Syntactische vrijheid
[bewerken | brontekst bewerken]Een andere eigenschap van Perl is dat de syntaxis erg flexibel is; Larry Wall heeft dit tot algemeen motto verklaard: There's more than one way to do it.'
Een voorbeeld van vier manieren om hetzelfde op te schrijven:
if ($var > 4)
{
process($var);
}
process($var)
if $var > 4;
$var > 4
and process($var);
process($var)
unless !($var > 4);
Veel programmeurs voeren aan dat dit tot moeilijker leesbare code leidt doordat programmeurs hun eigen schrijfstijl ontwikkelen en moeten wennen aan de stijl van een ander.
De reden van deze vrijheid is, zoals genoemd, dat Perl probeert om het typische, compacte idioom te ondersteunen van andere scripttalen zoals sed, awk en sh.
Compactheid
[bewerken | brontekst bewerken]Een taal als Perl is ontworpen als scripttaal, waarbij compactheid een belangrijk voordeel is. Dit geldt veel minder voor een algemene programmeertaal als C of Java, waarvoor leesbaarheid belangrijker is dan compactheid. Perl laat toe om op dezelfde manier te programmeren, maar vooral als er snel even iets tijdelijks gemaakt moet worden komen de meer compacte idiomen goed van pas.
In zulk idioom gebeurt meer per regel, dus is het geen wonder dat het begrijpen per regel ook meer moeite kost.
Perl leren
[bewerken | brontekst bewerken]Boeken
[bewerken | brontekst bewerken]Larry Wall was vanaf 1995 tot 2003 in dienst bij de uitgever O'Reilly, die enige zeer populaire Perlboeken heeft uitgegeven. Het dier op de kaft van de boeken van O'Reilly geeft het boek ook meteen een bijnaam, zoals het Camel Book voor Programming Perl.
Titel | Omschrijving | Bijnaam |
---|---|---|
Learning Perl | Voor programmeurs die Perl willen leren | Lama |
Intermediate Perl | Het vervolg op Learning Perl | Alpaca |
Mastering Perl | Recepten voor alledaagse problemen | Vicuña |
Programming Perl | Dit is geen boek voor beginners, maar een volledig naslagwerk | Kameel |
Andere, recente boeken zijn Modern Perl en Beginning Perl.
Perldoc
[bewerken | brontekst bewerken]Iedere Perlinstallatie beschikt over uitgebreide documentatie die wordt opgevraagd met de opdracht perldoc.
Zo wordt bijvoorbeeld de documentatie van de functie reverse() opgeroepen:
perldoc -f reverse
Een introductie met:
perldoc perlintro
En een overzicht van alle geïnstalleerde documentatie met:
perldoc perl
Bijeenkomsten van de Perl Mongers zijn een goede manier om ervaringen met Perlprogrammeurs uit te wisselen. Er wordt jaarlijks een meerdaagse Perlconferentie georganiseerd: YAPC.
Geschiedenis van Perl
[bewerken | brontekst bewerken]Perl 1.0
[bewerken | brontekst bewerken]Perl is ontstaan als een rapportagetool: een programma dat informatie uit tekstbestanden haalt en in rapportvorm presenteert. Larry Wall postte versie 1.0 in 1987 in de nieuwsgroep comp.sources.misc.
Perl 2 t/m 4
[bewerken | brontekst bewerken]Al snel groeide Perl uit tot een algemene scripttaal voor Unixsystemen, die voor tekstbewerking de sterke punten van AWK en de Bourne-shell in zich verenigde. Dit was een grote stap vooruit ten opzichte van shellscripts, die voor de meest eenvoudige functies allerlei externe programma's moeten aanroepen. Ook werden de meeste system calls en standard library-functies ingebouwd, zodat Perl qua uitdrukkingskracht vergelijkbaar werd met C: ook het low-level programmeren van bv. multiprocessing en procescommunicatie via sockets en netwerken was nu mogelijk. Ook werd de package ingevoerd, een eenvoudige manier voor namespacing waarmee losse modules gemaakt konden worden. Ondersteuning voor datastructuren bleef beperkt: alleen de array, de associatieve array en globbing, een primitief reference-mechanisme.
De belangrijkste toepassingen bleven batchgewijze tekstbewerking en scripts voor systeembeheer.
Nieuwe releases bleven uitkomen tot 4.036.
Perl 5
[bewerken | brontekst bewerken]De belangrijkste verbeteringen in Perl 5:
- references, waarmee willekeurige geneste datastructuren gebouwd kunnen worden
- variabelen met lexicale scope, en
- modules, objecten en klassen, waarmee het programmeren en gebruiken van herbruikbare softwarebibliotheken veel eenvoudiger werd.
Hierdoor kon CPAN ontstaan, de centrale repository van vrijelijk herbruikbare Perl-bibliotheken. Nieuwe functionaliteit werd nu niet langer aan de taal toegevoegd, maar als CPAN-module beschikbaar gesteld.
Perl werd nu zeer populair als "plak"-taal om systemen met elkaar te verbinden. Vanaf de opkomst van het world wide web tot eind jaren negentig was het de belangrijkste taal voor webapplicaties. Later werd PHP populairder.
In 2000 werd de volgende versie van Perl, versie 6, gestart. Deze maakt onder meer betere (statische) typering mogelijk. Van versie 5 komen jaarlijks onderhoudsreleases uit met kleine verbeteringen. In 5.10 zijn zelfs wat features uit Perl 6 toegevoegd[2]; deze moeten expliciet worden ingeschakeld om de achterwaartse compatibiliteit niet te verbreken.[3]
Perl 6
[bewerken | brontekst bewerken]De ontwikkeling van versie 6 is in 2000 begonnen en is in volle gang. De opleverdatum is nog niet bekend, maar
- Perl 6 zal niet backwards compatible zijn: programma's geschreven onder versie 5 zullen niet onder versie 6 draaien;
- Perl 6 heeft een hybride typing: er zal static en dynamic typing gebruikt kunnen worden;
- Perl 6 heeft bij functies standaard formal parameter passing;
- Perl 6 kent sigil invariance;
- Perl 6 kent een robuuster objectmodel;
- Perl 6 kent een uitbreiding op de regular expressions met de nieuwe naam grammars;
- Perl 6 kent chained comparisons zoals
if C(20) <= $temperature <= C(25) { say "Kamertemperatuur!" }
; - Perl 6 kent lazy evaluation;
- Perl 6 kent junctions;
- Perl 6 heeft Lisp-achtige macro's;
In plaats van een interpreter zal Perl 6 gebruikmaken van een virtuele machine genaamd Parrot, die ook geschikt is voor andere scripttalen zoals PHP of Ruby.
Perl in actie
[bewerken | brontekst bewerken]Voorbeelden van populaire vrije Perlsoftware:
- AWStats (Webstatistieken)
- Bugzilla (een bugtracker)
- Majordomo (Mailinglistmanagement)
- MRTG (Grafische weergave netwerkverkeer)
- SpamAssassin (Spamfilter)
- WebGUI (Contentmanagementsysteem)
- Webmin
- OTRS
Externe links
[bewerken | brontekst bewerken]- (en) Projectpagina
- perl.com (O'Reilly-communitysite voor Perl)
- ActivePerl (Perl voor Windows)
- Strawberry Perl (Perl voor Windows)
- ↑ "perl v5.40.0 is now available"; auteur (als tekenreeks): Graham Knop; datum van uitgave: 9 juni 2024; geraadpleegd op: 10 juni 2024.
- ↑ Perl 5.10.0 Released, door Rafael Garcia-Suarez, op dev.perl.org, 18 dec 2007
- ↑ feature, in de Perl 5.10-documentatie, door Rafael Garcia-Suarez, op cpan.org