Perl
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.
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.
Au LIPM, perl est le langage de prédilection pour l'ensemble des développements bioinformatiques.
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 _.
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.