FAQ PerlConsultez toutes les FAQ

Nombre d'auteurs : 18, nombre de questions : 250, dernière mise à jour : 29 octobre 2015  Ajouter une question

 

Bienvenue sur la FAQ Perl. Cette FAQ a pour vocation de vous enseigner ou de vous faire revoir les notions élémentaires de ce fantastique langage. Perl est très utilisé dans différents domaines depuis la gestion système, le réseaux, l'administration de bases de données, le web (CGI), la bureautique, la conception d'interfaces graphiques ou des contextes scientifiques telle la bioinformatique. Nous espérons que cette FAQ vous sera d'une grande utilité.

Vous souhaitez participer à l'amélioration de cette FAQ, n'hésitez pas !! Commentez

Bonne lecture !


SommaireQuestions diverses (3)
précédent sommaire suivant
 

Version courte :

Mettez

Code perl : Sélectionner tout
1
2
3
#!/usr/bin/env perl 
use strict; 
use warnings;
au début de tous vos scripts.

Indentez proprement, ou demandez à perltidy de le faire pour vous.

Code : Sélectionner tout
perltidy -b mon_script.pl
  • éventuellement demandez à perlcritic de commenter votre code, vous n'êtes pas obligé de corriger tout ce qu'il vous dit, mais ce sera déjà un bon point de départ ;
  • utilisez les modules du CPAN ! Ce conseil vaut doublement pour les modules du CORE (qui viennent en standard avec Perl) excepté Switch sous Perl 5.8 ;
  • n'utilisez pas les modules pour ce que vous pouvez faire en deux lignes ;
  • utilisez les hashs, pas les tableaux, lorsque les données ont un index textuel évident pour votre utilisation desdites données dans votre script.

Bien sûr les conseils habituels à la programmation en n'importe quel langage s'appliquent :

  • donnez des noms significatifs à vos variables ! Ne basez pas vos noms sur le type du contenu, mais sur son utilisation, sa provenance et sa destination ;
  • adoptez des conventions pour nommer vos variables et fonctions : en Perl la convention la plus répandue est d'utiliser des soulignés "_" entre les mots, et de commencer les noms de fonctions par un verbe. L'important est que vous (et votre équipe) adoptiez UNE convention (quelle qu'elle soit !) et que vous vous y teniez ;
  • découpez votre code en fonctions : DRY, Don't Repeat Yourself (Ne vous répétez pas !) ;
  • découpez votre application en modules ;
  • n'utilisez pas goto (sauf la version "goto function" spécifique au Perl, si vous savez ce que vous faites) ;
  • n'utilisez les variables globales que contraint et forcé ou pour des variables de configuration. Déclarez vos variables avec my().

Version longue (aka "Les explications") :

La devise de Perl est TIMTOWDI, c'est-à-dire "There Is More Than One Way To Do It", en français : « Il y a plus d'une façon de le faire ! »
Et effectivement Perl est un langage très flexible et puissant dans lequel vous pouvez adopter une multitude de méthodes différentes pour parvenir au même résultat.
Malheureusement, cela ne signifie pas que toutes les méthodes sont également viables, également efficaces, ou également faciles à entretenir ou lisibles...

Dans ce topic, je vais donc indiquer quelques points qui me semblent importants pour obtenir un résultat potable. Ce sujet est destiné aussi bien aux novices qu'aux expérimentés (je ne dirais pas aux experts, il n'y a pas beaucoup d'« experts » en Perl, et à mon avis ceux qui le sont doivent déjà savoir tout ce que je vais dire).

Le pragma "strict"

Qu'est-ce qu'un pragma ? C'est une instruction au compilateur/interpréteur qui modifie le comportement du langage sur une portée limitée. En Perl les pragmas sont chargés avec "use" ou déchargés avec "no", leur nom est tout en minuscules, contrairement aux noms de modules qui par convention doivent commencer par une majuscule.

Le pragma "strict" interdit l'usage d'un certain nombre de constructions normalement valables en Perl, mais qui sont responsables de la plupart des erreurs basiques que peuvent rencontrer un novice, voire parfois un expert.
Pourquoi ces constructions ne sont-elles pas simplement supprimées du langage si elles sont si dangereuses me demanderez-vous. Pour trois raisons :

  • le poids de l'histoire : Perl est un « vieux » langage, qui a commencé ses jours comme une simple glue Unix, alors que les shells étaient encore plus rudimentaires qu'aujourd'hui, il a retenu certains des défauts des shells de l'époque, défauts peu importants pour un petit script de quelques lignes, beaucoup plus pour un programme constitué d'une vingtaine de modules... Mais l'une des fiertés de Perl est sa compatibilité rétroactive (backward compatibility), autrement dit sa capacité à faire tourner des scripts vieux de 10 ans sans modification. Ce trait est assez rare pour le type de langage que Perl représente et il y réussit effectivement de façon impressionnante ;
  • l'utilité de ces constructions : en effet certaines de ces constructions peuvent se révéler utiles dans des cas très particuliers et pour faire des choses relevant de la magie noire. Mais ceci ne vous concerne que si vous avez l'habitude de mettre des modules complexes sur le CPAN, qui touchent au comportement même de Perl ou ce genre de chose ;
  • dans un très petit script (ne dépassant pas dix lignes à mon avis, mais d'autres seront plus larges dans leur appréciation) ou un uniligne utiliser ces constructions interdites ne porte pas vraiment à conséquence et se les interdire alourdirait inutilement le programme.

Mais quels sont donc les effets concrets de strict ? Sans rentrer dans le détail, les principaux effets sont l'obligation de déclarer toutes ses nouvelles variables (avec my() pour les variables lexicales, our() pour les variables globales de paquetage), l'interdiction des mots « nus » (barewords, autrement dit, sans 'strict' Perl interprète tout mot isolé qu'il ne reconnait pas (pas un nom de fonction ou de HANDLE de fichier) comme une chaîne de caractères), et l'interdiction des références symboliques (l'utilisation d'une chaîne de caractères variable comme nom de variable).

Le pragma "warnings"

À partir de Perl 5.6 vous pouvez utiliser ce pragma en remplacement de l'option en ligne de commande -w (qu'on pouvait également indiquer sur la ligne de shebang d'un script). Il active les avertissements de Perl, qui vous indiquent les constructions douteuses ou ressemblant à des erreurs classiques dans votre code, à l'exécution comme à la compilation. Il ne s'agira pas toujours d'erreurs réelles, mais souvent un meilleur style de programmation peut faire disparaître ces avertissements, et dans les rares cas où vous vous estimez justifié dans votre utilisation, un autre avantage du pragma warnings apparaîtra : vous pouvez le désactivez sélectivement sur une portion de code donnée et pour certains types d'avertissements précisément, lisez perldoc perllexwarn pour une explication en profondeur des avantages du pragma sur l'option -w.

Perl::Tidy

Le module Perl::Tidy et l'utilitaire perltidy qui vient avec ce module permettent de reformater aisément son code Perl, par exemple pour le mettre en conformité avec une norme d'entreprise ou un format que vous préférez à celui employé dans le code d'origine. Le formatage est complètement configurable et vous pouvez ainsi façonner le résultat exactement à votre goût. Indispensable !!

Perl::Critic

Perl::Critic et l'utilitaire perlcritic associé critique votre code selon un certain nombre de règles de bonne pratique décrites sous forme de module, dont beaucoup sont distribuées avec Perl::Critic (mais pas toutes), vous pouvez configurer exactement lesquelles prendre en compte (en plus du système de « niveau de sévérité » intégré à Perl::Critic) ou même en écrire de nouvelles.
En complément de cela si vous avez le temps (ou les sous), lisez Perl Best Practices ou sa traduction française De l'art de programmer en Perl, excellent bouquin, qui se lit facilement, (mais un peu cher) et qui a servi de base à perlcritic.

Les modules et le CPAN

Ne réinventez pas la roue : surtout si vous êtes débutant (et que vous n'êtes pas en train de coder dans un but pédagogique), le code que vous produirez sera sans doute moins bon, moins robuste, moins efficace que le module du CPAN correspondant, et en plus il sera plus long à réécrire. Pensez toujours au CPAN, faites vos recherches dessus avec le site officiel.

Ce qui ne veut pas dire que votre programme doit ressembler à une collection de modules du CPAN ! N'utilisez pas un module pour une seule fonction facilement refaite en quelques lignes par vous-même (n'oubliez pas néanmoins que parfois la fonction du module a été écrite pour effectuer cette tâche bien plus rapidement et de façon bien plus robuste que votre pauvre petit remplacement). Ceci ne vaut pas pour les modules du CORE, ils sont disponibles partout (ou presque, voir la question Comment savoir si un module est disponible dans le Core de Perl ?) et sont la plupart du temps très bien codés donc n'hésitez surtout pas à les utiliser (sauf Switch, oubliez cette abomination !! Si vous voulez un switch..case en Perl, utilisez Perl5.10 qui offre un très bon switch intégré. Les hashs sont souvent également un excellent substitut à la plupart des usages de switch..case).
Pour en savoir plus sur l'utilisation de Switch, lisez cet : item.

Il y a également le cas où vous n'êtes pas tout à fait satisfait des modules disponibles sur le CPAN, n'hésitez pas alors à vous lancer dans la création d'un nouveau module (si vous êtes un programmeur suffisamment expérimenté), c'est ainsi qu'on fait progresser les choses ! Vous pouvez également proposer un patch à l'auteur d'un des modules du CPAN : s'il améliore les choses, ne brise pas la compatibilité arrière et relève vraiment du module, il sera très certainement accepté.

Mis à jour le 30 août 2010 Jedai

L'invite de commande Windows se démarque des shells Unix par le fait que l'expansion des caractères génériques de fichier n'est pas faite par l'invite de commande (le shell), mais doit être réalisée par le programme qui est appelé par la commande.

Or, par défaut, Perl ne réalise pas cette opération qui n'est pas nécessaire pour les autres shell (Linux/Unix/Mac). Pour remédier à ce manque, il existe une astuce que voici :

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
  
C:\> copy con C:\Perl\lib\Wild.pm 
# Wild.pm - emulate shell @ARGV expansion on shells that don't 
use File::DosGlob; 
@ARGV = map { 
	      my @g = File::DosGlob::glob($_) if /[*?]/; 
	      @g ? @g : $_; 
	    } @ARGV; 
1; 
^Z 
C:\> set PERL5OPT=-MWild
Explication de la commande DOS copy con

La commande COPY suivante permet de copier ce que vous entrez au clavier vers un fichier de sortie (C:\perl\lib\Wild.pm en espérant que Perl est bien installé dans le C:\).

Une fois que vous avez tapé la commande et appuyé sur ENTRÉE, le DOS copie dans C:\Perl\lib\Wild.pm toutes les données saisies.
Appuyez ensuite sur la combinaison de touches "CTRL"+"Z" pour marquer la fin du fichier. Le caractère CTRL+Z est symbolisé à l'écran par "^Z". Vous pouvez également interrompre la commande COPY [CON] en appuyant sur la touche F6, qui génère le caractère CTRL+Z de fin de fichier symbolisé à l'écran par "^Z". Ensuite, vous appuyez sur la touche "ENTRÉE".

À ce stade, le fichier est créé. Il permettra à Perl d'émuler le comportement attendu du caractère étoilé.
Afin que votre terminal DOS fasse appel au module Wild nouvellement créé, une variable d'environnement temporaire a été définie de la sorte :

Code : Sélectionner tout
set PERL5OPT=-MWild
À chaque fois que perl sera appelé dans le terminal DOS en cours d'utilisation, l'option -MWild sera ajoutée.

On pourra (re)définir PERL5OPT au niveau du système de sorte que l'option soit active pour toutes les invites de commande DOS.

Cette astuce est tirée de cet article, au paragraphe Command-line Wildcard Expansion.

Maintenant, sous une console DOS, vous pouvez par exemple lancer cette uniligne Perl comme sous Linux :

Code perl : Sélectionner tout
1
2
  
perl -pi -e "s/TATA/TONTON/g;" *.txt

Mis à jour le 26 juillet 2012 Philou67430

Pour supprimer les accents d'une chaîne de caractères, nous avons l'habitude de supprimer individuellement les accents à coup d'expressions régulières :

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl 
use warnings; 
use strict; 
use utf8; 
  
binmode( STDOUT, ":utf8" ); 
my $chaine = "Lugné-Poë Risus quisque netus vel séd arcû curàbitur conséquat dui ultricies molestie, class habitant nostra cràs augueé ut séd énis ultricies bibéndum, sociosqu mattis netus aptent d'rhoncus portitorsé bibendum commodoé praesent dïam commodoé. Conubia cras mattisé ? 
lacus proin 41 165€ ultrices, inceptos çunc mattis porttitor sét urna vivérra pellentesque malesuada, at torétoré elementum tristique nîbh scéléréo maécènas dui. Laoreet lorem rûtrum odio taciti sém famès scéléréo séd semper nisi maécènas voluptà nètus elit duis, susîcpit donéc quisquées sociosqu cél quisque prétium turpis habitant ultricités nostra sodalés quisqué dapidûs éléfantid, quisqué lacus ligula fusce magnès ultrices integer class aenean variûs sènèctus Frînglilia massè curàbitur tristique, mattisé laçus sodales."; 
  
$chaine =~ tr/éèëàçû/eeeacu/; 
print $chaine, "\n";

Le souci de cette méthode est qu'elle est fastidieuse, car nous ne sommes pas sûr de gérer tous les accents (minuscules, majuscules...).
La meilleure façon consiste à passer par une normalisation unicode. Le principe consiste à :
  • faire une décomposition NFKD pour décomposer les caractères par équivalence canonique et de compatibilité, et ces derniers sont réordonnés ;
  • supprimer les caractères diacritiques.


Le module Perl Unicode::Normalize permet ces manipulations.

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl 
use warnings; 
use strict; 
use utf8; 
  
use Unicode::Normalize; 
  
binmode( STDOUT, ":utf8" ); 
my $chaine = "Lugné-Poë Risus quisque netus vel séd arcû curàbitur conséquat dui ultricies molestie, class habitant nostra cràs augueé ut séd énis ultricies bibéndum, sociosqu mattis netus aptent d'rhoncus portitorsé bibendum commodoé praesent dïam commodoé. Conubia cras mattisé ? 
lacus proin 41 165€ ultrices, inceptos çunc mattis porttitor sét urna vivérra pellentesque malesuada, at torétoré elementum tristique nîbh scéléréo maécènas dui. Laoreet lorem rûtrum odio taciti sém famès scéléréo séd semper nisi maécènas voluptà nètus elit duis, susîcpit donéc quisquées sociosqu cél quisque prétium turpis habitant ultricités nostra sodalés quisqué dapidûs éléfantid, quisqué lacus ligula fusce magnès ultrices integer class aenean variûs sènèctus Frînglilia massè curàbitur tristique, mattisé laçus sodales."; 
  
  
print suppression_accents($chaine), "\n"; 
  
sub suppression_accents { 
    my ($chaine) = shift; 
  
    # Normalisation de la chaîne 
    $chaine = NFKD($chaine); 
  
    # Suppression des caractères diacritiques     
    $chaine =~ s/\p{NonspacingMark}//g; 
    return $chaine; 
}

Ce code est simple et tous vos accents sont convertis.

Si vous souhaitez commenter, n'hésitez pas !

Mis à jour le 17 août 2015 djibril

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2018 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsable bénévole de la rubrique Perl : djibril -