Perl

Fiche logiciel validé
  • Création ou MAJ importante : 24/12/09
  • Correction mineure : 13/02/12
Mots-clés

Perl : langage de script orienté système, utilisable également pour des applications "métiers"

Description
Fonctionnalités générales

Un langage adapté au traitement de fichiers textes

perl (Practical Extraction and Report Language) est un langage de script, qui était au début (1987) destiné aux administrateurs système: perl peut être vu comme l’intégration dans un seul langage des différents shells Unix, ainsi que des principaux utilitaires de traitement de fichiers (awk, grep, sed, …), le tout avec une syntaxe proche du langage C.

perl comprend de manière native, et très bien intégrée au langage via des opérateurs spécialisés, le support des expressions rationnelles. Cette caractéristique est précieuse pour le traitement des chaines de caractères (les expressions rationnelles de Perl supportent de nombreuses extensions par rapport aux expressions rationnelles de awk, lex, sed, etc.).

Au début des années 90, perl s'est rapidement imposé comme le langage de choix pour écrire des sites webs dynamiques (scripts cgi utilisant des modules Perl CGI). Par ailleurs, le langage a rapidement évolué jusqu’à devenir un véritable langage généraliste: ces trois caractéristiques (langage puissant, scripts cgi, facilité de traitement de fichiers textes) expliquent que perl soit aujourd'hui très utilisé pour des développements applicatifs dans certains métiers, en particulier la bioinformatique (métier qui consiste pour une bonne part à traiter des fichiers textes et envoyer le résultat via des scripts cgi).

Un langage interprété:
perl est un langage interprété, ou plus exactement précompilé: le programme est analysé syntaxiquement avant d'être exécuté, ce qui oblige le programmeur à corriger d'emblée toutes les erreurs de syntaxe.

Typage:
perl est un langage faiblement typé: il reconnait trois types principaux de variables:

  • Les scalaires
  • Les tableaux
  • Les tableaux associatifs.

De nombreuses fonctions ou opérateurs permettent de passer aisément d'un type à un autre.
Par ailleurs, une variable scalaire a un type "chaine de caractères" ou "numérique". Le type est affecté automatiquement par le programme, mais en cas de besoin le programmeur peut forcer un type ou un autre.

Structuration en blocs:
Le code est organisé en blocs (délimités par des accolades), qui permettent de définir la portée des variables ainsi qu'on le fait en langage C. Il est par conséquent possible (et recommandé) de travailler avec des variables locales.

Fonctions:
Il est possible de définir des fonctions, mais le langage n'assure pas de contrôle des paramètres: passer des paramètres à des fonctions revient en fait à passer une liste, ce qui est bien pratique lorsqu'on désire passer un nombre indéterminé de paramètres, mais peut aussi conduire à du code fort peu rigoureux. D'autre part, l'édition de liens se fait de manière dynamique, ce qui présente toutefois un inconvénient: une fonction appelée mais non définie ne sera détectée qu'au moment de l'appel de ladite fonction.

Références et gestion de la mémoire:
Perl comprend les "références" (équivalent aux pointeurs en C), bien utiles pour passer des tableaux (ordinaires ou associatifs) en paramètre à des fonctions. Une gestion de la mémoire rigoureuse (fonctionnant par comptage de référence) assure qu'il n'y aura pas de fuites de mémoire.

Modules:
Il est possible d'implémenter des modules en perl, en définissant des fonctions ou des variables internes au module, ou d'autres qui seront exportées.
Par exemple, le module Perl-DBI permet de s'interfacer avec pratiquement n'importe quel système de base de données.

Autres fonctionnalités

Orientation objets:
perl n'est pas à l'origine un langage orienté objets. Cependant, une extension du langage permet de définir des objets. Un objet perl est une "référence nommée"; il n'y a pas de mot clé class, une classe n'est autre qu'un module. La notion d'héritage se gère en déclarant un tableau ayant un nom réservé (ISA), qui contient la liste des paquetages dont hérite le module en cours de définition (on peut donc définir des héritages multiples pour le meilleur comme pour le pire). De plus en plus de modules objets sont aujourd'hui disponibles.

pod:
Un système très simple permet d'embarquer la documentation dans le code. Cela permet d'avoir un code bien documenté, avec des utilitaires pour convertir la documentation en format texte, html, etc.

perl utilisé en tant que commande unix:
Perl peut aussi être utilisé comme un utilitaire unix supplémentaire: pour ce faire, trois commutateurs sont très utiles, ils permettent de transformer perl en filtre, à la manière de awk ou sed:

  • -e 'code perl' permet de définir le mini-programme perl (généralement une ligne) à exécuter
  • -n impose d'exécuter ce programme sur chaque ligne de l'entrée standard, à la manière de sed ou awk
  • -p imprime systématiquement la ligne (éventuellement modifiée) sur la sortie standard , à la manière de sed

Débogueur perl:
La commande perl -d votre_script les_paramètres exécute le script en mode débogueur. Le débogueur ressemble au gdb standard (débogueur C), il constitue une aide précieuse au développement.

Modules C/C++:
Il est possible, mais compliqué, d'écrire des modules en C ou en C++

Programmation système:
perl contient un grand nombre de fonctions utiles en programmation système. Ces fonctions sont généralement des interfaces perl vers la fonction C équivalente. Il est à noter que les portages windows de perl comprennent également les mêmes interfaces vers les fonctions systèmes propres à windows, de sorte que perl est un outil de choix pour écrire des scripts systèmes aussi sous Windows.

Contexte d'utilisation dans mon laboratoire/service

Au LIPM, perl est le langage de prédilection pour l'ensemble des développements bioinformatiques.

Limitations, difficultés, fonctionnalités importantes non couvertes

Un langage trop laxiste:
perl est conçu au départ pour écrire de petits scripts "quick and dirty". Il se prête toutefois très bien à l'écriture de programmes plus ambitieux, mais dans ce cas il est recommandé de commencer le programme par les deux "formules magiques":

  • use strict qui impose notamment au programmeur de déclarer ses variables.
  • use warnings qui produit la génération d'un grand nombre de "warnings", la plupart du temps très pertinents.

Une syntaxe objets fastidieuse:
Il manque l'équivalent C des struct, ou l'équivalent C++/java des class: du coup, il est difficile d'agréger des objets autrement que par des tableaux (associatifs ou non). De manière générale, la syntaxe permettant de faire de la programmation objets, si elle est cohérente (d'un point-de-vue théorique, un objet peut se définir comme un module pourvu d'une identité), est assez lourde et rebutante.

Du code pas toujours très lisible:
perl est un langage orienté "TIMTOWTDI" (There's More than One Way To Do It"). Cela est un avantage, car il s'adapte à la structure de tous les cerveaux, mêmes les plus tordus... mais cela peut aussi constituer un défaut, car le code n'est pas toujours très lisible. On a pu dire aussi que perl est un "WOL", un Write-Only Language. En fait, tout dépend de l'écrivain et des contraintes qu'il accepte de s'appliquer à lui-même. Le service en ligne http://perlcritic.com/ peut apporter une aide.

Définition des objets et modules:
Lorsqu'on définit un module ou un objet, il n'y a pas de contrôle d'accès: il est toujours possible, à partir de n'importe quelle fonction du programme, d'utiliser une fonction non exportée par un module ou une méthode privée d'un objet. Il est donc très important de bien documenter son code. Une "astuce" souvent appliquée pour contourner cette limitation est de refléter l'état d'une méthode ou d'un membre dans son nom: le nom d'une méthode privée débutera par __, le nom d'une méthode protégée par _.

Environnement du logiciel
Distributions dans lesquelles ce logiciel est intégré
  • Toutes les distributions gnu/linux comprennent perl dans les paquets de base (perl est utilisé par certaines parties du système). perl est également intégré à mac OS/X et à d'autres unix propriétaires.
  • Pour windows, il existe plusieurs portages de perl: http://win32.perl.org
    Le module Win32::OLE permet de piloter pratiquement tous les systèmes Win32.
  • La version 5.8.8 est bien implantée maintenant, je pense qu'on pourra passer à 5.10 d'ici quelques mois (le temps que les distributions ou autres OS intègrent cette version).
Plates-formes
  • Tous les unix
  • Tous les windows (à partir de windows 95)
  • Tous les macs (à partir de mac OS v7)
  • VMS
Logiciels connexes
  • perldoc est un utilitaire permettant de lire la documentation de perl, ou encore les lignes pod des modules ou des scripts écrits en perl.
  • cpan, à la fois un utilitaire et un service en ligne (www.cpan.org), permet d'installer très simplement des modules supplémentaires.
  • BioPerl, bibliothèque Perl de modélisation et traitement de données de biologie : http://www.projet-plume.org/fiche/bioperl BioPerl est une des nombreuses bibliothèques présentes sur le CPAN.
  • pcre ( http://www.pcre.org/ ) est une bibliothèque C qui implémente le moteur d'expressions rationnelles de perl. Il est donc aisé d'incorporer dans d'autres logicielles les expressions rationnelles de perl: cela a été réalisé par exemple dans apache ou dans php
  • Ruby, un autre langage de script (plus récent que perl, plus nettement orienté objet): http://www.projet-plume.org/fiche/ruby
Autres logiciels aux fonctionnalités équivalentes

python, ruby

Environnement de développement
Type de structure associée au développement

A l'origine l'œuvre de Larry Wall, la version 6 de perl est préparée par la "communauté", par l'intermédiaire de la "Perl Foundation".

Eléments de pérennité
  • perl existe depuis 1987: 20 ans et toutes ses dents !
  • La compatibilité ascendante, lors des changements de version, a toujours été excellente, ce qui permet de préserver le code existant, dont le stock (accessible via le cpan) est aujourd'hui exceptionnel.
  • Il bénéficie aujourd'hui d'une communauté importante, avec entre autres des groupes locaux: voir http://www.mongueurs.net/
  • On trouve aujourd'hui beaucoup de scripts perl dans le système gnu/linux
Références d'utilisateurs institutionnels
  • Tous
Environnement utilisateur
Documentation utilisateur

http://www.perl.org/docs.html
La documentation en français: http://perl.enstimac.fr/DocFr.html
Perl en Français dans le texte: http://www.perlfr.org/

Divers (astuces, actualités, sécurité)

La version 5.10.0, sortie en fin 2007, se retrouve progressivement dans toutes les distributions gnu/Linux. Attention, il semble qu'il y ait quelques menus soucis de compatibilité avec cette version: après mise à jours vérifiez bien que vos scripts fonctionnent toujours ! Si ce n'est pas le cas, il est toujours possible d'installer plusieurs versions de perl sur la même machine (quitte à compiler la 5.8.8 si votre distribution ne vous la propose plus). Cependant, cela ajoute en complexité, en particulier si l'on utilise de nombreux modules externes... Par ailleurs, cette version apporte quelques améliorations et de meilleures performances.

Commentaires

Responsable thématique précédent

Cette fiche a d'abord été suivie par le responsable thématique Jacquelin Charbonnel. Gilian Gambini l'a reprise en février 2012.