Il prend en charge les expressions régulières dans sa syntaxe même, permettant ainsi directement des actions sur l'aspect général de séquences de texte.
Une association, The Perl Foundation, s'occupe de son devenir, et entre autres de son éventuel passage de la version 5.x à la version 7[9] — la version 6 initialement envisagée comme le successeur de Perl 5 ayant divergé au point de devenir un langage à part entière nommé Raku. Le statut du langage est celui de logiciel libre, distribué sous double licence : Artistic License et GPL.
Origines et mises en œuvre
Le but
Perl se propose d'extraire commodément des informations de fichiers texte et d'en établir des rapports. Il peut remplacer des scripts shell ainsi que des commandes comme sed, awk, grep, cut, test et expr. Traitant des formats d'entrée non obligatoirement structurés, il évite de passer des données d'un processus à l'autre et de rendre ainsi moins lisibles les traitements, auxquels il fournit un cadre unifié. Sa syntaxe s'inspire du C, y ajoute la possibilité d'expressions régulières directement dans le langage, et comporte les principales fonctions des bibliothèques système en C.
Il vise aussi la commodité pragmatique pour le programmeur (existence de raccourcis qui le font qualifier de langage « diagonal ») plutôt qu'un souhait esthétique d'architecture stricte (langages « orthogonaux »)[10].
Les moyens
Perl, multiplate-forme, est utilisé entre autres pour l'écriture de scripts CGI et le traitement de fichiers de log. Il permet aussi d'ajouter des « in-process » dans un serveurweb Apache, grâce à l'extension mod_perl, à l'instar de PHP ou de servletsJava.
Depuis 2008 existe Strawberry[11] pour Windows, proche de la distribution Unix originale, avec un compilateurC et disponible en version 32 et 64 bits ainsi qu'en version portable (sans installation).
Syntaxe et sémantique
Commentaire
Perl est un langage impératif proche de C et des shells UNIX. Comme en shell, le caractèrecroisillon (#) introduit un commentaire et le retour à la ligne le termine. Il est également possible d'utiliser POD pour écrire un commentaire sur plusieurs lignes.
# Je suis un commentaire classiquemy$variable=1;# Je suis un commentaire après une ligne de code=for comment Je suis un commentaire sur plusieurs lignes.=cut
La syntaxe de Perl lui permet d'exprimer de manière concise dans le langage même des expressions sans appels de fonctions de bibliothèques, donc de façon plus lisible. Le débutant peut facilement n'utiliser qu'un sous-ensemble du langage.
le sigil dollar $ dénote une variable scalaire (comme pour les shells Unix)
$a=42;# Affectation de '42' à la variable 'a'$b='réponse : ';# Affectation d'une chaîne de caractère à 'b'print"$b",$a*$a;# Affiche 'réponse : 1764'
le sigil arobase@ désigne une variable tableau et est indexé par [] (ils peuvent être utilisés comme des piles ou des files, point commun avec JavaScript)
@a=('lun','mar','mer','jeu','ven','sam','dim');# Affecte une liste à la variable tableau 'a'print$a[2];# Affiche 'mer' (l'indexation commence à zéro)# récupération de plusieurs éléments ou d'une tranche d'un tableaumy@b=@a[2,4];# @b = ( 'mer', 'ven' )my@c=@a[2..4];# @c = ( 'mer', 'jeu', 'ven' )
le sigil pour cent % désigne un tableau associatif, aussi appelé hashage ou hash et est indexé par {}
%a=(# Création d'une table de hachage clef => valeurJohn=>'Sheridan',Londo=>'Mollari',Kosh=>'Naranek');print$a{Londo};# Affiche 'Mollari'
Contrairement à Perl 6 le sigil $ est utilisé lors de l'appel d'un élément d'un tableau ou d'un élément de hash. Cela vient du fait qu'on appelle généralement un élément scalaire. Exemple:
$a[2];# Appel d'un élément de tableau/liste$a{John};# Appel d'un élément de table de hash
Les trois types de variables du même nom peuvent coexister:
$a='rien';# scalaire contenant la chaine 'rien'@a=1..5;# tableau contenant les chiffres '1, 2, 3, 4, 5'%a=(# table de hash contenant 3 paires de clef => valeurJohn=>'Sheridan',Londo=>'Mollari',Kosh=>'Naranek');
Perl accepte des déclarateurs indiquant la portée des variables déclarées :
my$toto='rien';# variable scalaire à portée lexicalelocal$level+=1;# variable scalaire avec une valeur à portée dynamiqueour@s=(1,$s,3.14);# variable tableau globale au module courant
Les sigils permettent de reconnaître les noms de variables dans des chaînes de caractères et d'interpréter ces variables.
Le module XML::Literal disponible sur le CPAN permet de supporter des littéraux de type XML de manière similaire à l'extension normalisée E4X d'ECMAScript.
La version 5.10 et le futur de Perl
Depuis sa version 5.10, le langage inclut des fonctionnalités destinées à l’origine à ce qui devait être le futur Perl 6, comme une structure de contrôle switch et les captures nommées pour l'opérateur match (c'est-à-dire la possibilité de nommer génériquement des éléments traités au vol). La 6e version du langage, annoncée en 2001, est disponible depuis [12]. En , « Perl 6 » est finalement renommé Raku pour éviter toute confusion avec Perl 5 et entériner le fait d’avoir deux langages distincts. En , la communauté pilotant Perl décide que la prochaine version majeure de Perl sera finalement nommée Perl 7[9].
L'intégration dans l'existant
Les programmes Perl sont intégralement portables entre GNU/Linux, Mac OS X (ou autre UNIX) et Windows malgré les désignations de fichiers différentes de ces systèmes (Perl remplace au besoin les « / » par des « \ », voire des « \\ »).
Perl permet l'usage du moteur d'interfaces graphiques Tk pour effectuer des entrées-sorties. On désigne parfois l'ensemble sous le nom générique Perl/Tk. L'extension Tk est intégrée à ActivePerl depuis la version 5.8 du langage.
Des interfaces graphiques plus commodes que Tk sont aussi proposées par des bibliothèques de CPAN.
TkZinc apporte un aspect modernisé de Tk. PerlQt supporte Qt 3.x. Gtk2 supporte Gtk 2.x. wxperl supporte wxWidgets. wxWidgets a l'avantage de fournir l’apparence native du système de fenêtrage utilisé. Sous Mac OS X, CamelBones donne accès à l'API de Cocoa.
Le mécanisme
Perl5, bien qu'interprété, ne réanalyse pas ses instructions chaque fois qu'il les exécute. Sans créer un bytecode comme d'autres langages interprétés, il effectue une passe d'assemblage qui traduit les constantes, remplace les variables par des adresses internes et construit un arbre syntaxique (AST, Abstract Syntax Tree).
Le code source est traduit instruction par instruction en AST, par la suite optimisé. Si des instructions sont situées dans un bloc spécial comme BEGIN ou CHECK, elles sont exécutées dès leur compilation (et donc avant que le reste du code source soit compilé). C'est le cas en particulier des modules chargés par l'instruction use. L'AST, par rapport à un AST usuel, a la particularité de contenir déjà les chemins d'exécution. Lors de la phase d'exécution, l'interpréteur suit donc les chemins présents dans l'AST et exécute les instructions restantes[13].
Perl 5 n'utilise à aucun moment de bytecode. Le projet de compilation en bytecode commencé lors de Perl 5.005 par Malcom Beattie n'a jamais abouti. L'arrivée de Parrot peut cependant offrir une nouvelle solution.
L'avenir à moyen terme
Plusieurs fonctionnalités des bibliothèques de Perl 5 seront intégrées dans Perl 6 : ainsi l'analyse syntaxique sera intégrée dans le moteur d'expressions rationnelles. Aujourd'hui, en Perl 5, un analyseur LALR peut s'écrire par le module Parse::Yapp, clone de yacc. Parse::RecDescent est un module qui permet l'écriture d'un analyseur récursif descendant.
Exemples de code
Une plaisanterie récurrente présente Perl comme acronyme de 'Pathologically Eclectic Rubbish Lister' (collectionneur pathologique de déchets variés) en référence à ses caractères spéciaux chargés de sens dans la syntaxe du langage, comme dans l'exemple suivant :
# Un exemple de programme en Perl$message="À l'endroit : 'camel'.\n";print$message;$message=~s/endroit/envers/;$message=~s/('\w+')/reverse($1)/e;print$message;exit0
print"Hello World\n";# Affiche 'Hello World' suivi d'un retour à la ligne
Faux amis
Certains mots ont un sens différent en Perl et dans la littérature informatique usuelle. Ci-après deux exemples :
Une fonction (function) est une fonction prédéfinie par le langage ;
Une routine, aussi appelée sous-routine (subroutine en anglais), est une fonction définie dans le programme ou une bibliothèque utilisée.
Aspects communautaires
Perl a une base d'utilisateurs vaste, mais de plus en plus concurrencée par celles de PHP, Python, Ruby, JavaScript, etc. Le langage est apprécié des administrateurs système mais également des développeurs dans le domaine de la bio-informatique où les programmes font l'objet de remaniements constants[14].
La base CPAN regroupe et met gratuitement à la disposition des utilisateurs de Perl 15,4 millions de lignes de code[n 1] sous forme de modules Perl et de synopsis montrant comment les mettre en œuvre.
En France, l'association des Mongueurs de Perl promeut ce langage, notamment via les Journées Perl.
Anecdotes
On écrit généralement le nom de ce langage avec un Pmajuscule pour désigner le langage et un pminuscule en parlant de l'interpréteur : « seul perl analyse correctement Perl. » Une conséquence est qu'un système de coloration syntaxique d'un programme Perl devrait utiliser l'interpréteur perl pour être totalement correct. En pratique, des modules pur Perl comme Perl::Tidy et PPI arrivent à comprendre correctement la majeure partie du code courant.
Initialement, le concepteur de Perl, Larry Wall, avait prévu de nommer son langage « pearl », d'après une parabole biblique se trouvant relatée dans l'Évangile selon Matthieu (chapitre 13, versets 45 et 46[15]). Il existait déjà un langage de programmation dénommé PEARL — pour la programmation multitâche et temps réel. Wall changea donc l'orthographe en « Perl »[16]. Les significations diverses que l'on trouve de nos jours comme le Practical Extraction and Report Language sont simplement des rétroacronymes. [réf. nécessaire]
Black Perl est un poème signé Larry Wall, écrit dans le langage de programmation Perl et dans la langue anglaise.