Pense-bêtes sur le langage Perl
Inclure des nouveaux chemins
avec l'option -I, par exemple pour inclure de dossier courant :
#!/usr/bin/perl -I.
Gérer les entrées/sorties
Codage en utf8
Avec l'option -C de perl :
#!/usr/bin/perl -CSDA
... permet d'un coup et une bonne fois de tout basculer en utf8. Explications :
- S : STDIN is assumed to be in UTF-8, STDOUT and STDERR will be in UTF-8
- D : UTF-8 is the default PerlIO layer for input and output streams
- A : the @ARGV elements are expected to be strings encoded in UTF-8
Voir perldoc perlrun pour plus de détails sur l'option -C... ou le binmode pour des changements ponctuels de codage.
Forcer la sortie
Pas d'instruction pour dire à Perl de vider un quelconque buffer, mais une directive pour lui indiquer que toutes les sorties doivent se faire sans attendre.
local $| = 1
Redéfinir la sortie par défaut
Cela se fait à l'aide de la fonction select : elle enregistre le nouveau canal de sortie et renvoie celui précédemment utilisé.
$old = select(MYOUT); # . # . # . # plein de print qui sortent automatiquement sur le canal MYOUT # . # . # . select($old); # on revient au canal précédent
Chronométrer/profiler un programme
Mesurer les temps d'exécution
Cela se fait simplement avec le module Benchmark.
# . # . # . use Benchmark; # . # . # . my $t0 = new Benchmark; # . # . # . # ici le code à évaluer # . # . # . my $t1 = new Benchmark; my $td = timediff($t1,$t0); print timestr($td),"\n";
Profiler un programme
Il s'agit de déterminer comment se répartit le temps d'exécution entre les différentes fonctions d'un script perl.
Directement, sans modifier le script Perl :
dprofpp -p test.pl dprofpp -p "test.pl parameters"
Puis, après l'exécution du programme, on appelle dprofpp, cette fois pour relire la trace produite :
dprofpp -r # classement des fonctions par temps utilisé dprofpp -T # appels des fonctions
Nota bene :
- À installer sous ubuntu depuis le paquet libdevel-dprof-perl.
- Voir les documentations de DProf.pm et dprofpp.pl.
- Cela ralentit considérablement et l'exécution et produit un fichier énorme (tmon.out).
Produire des images
Généralités
Il faut d'abord disposer de la librairie GD. Sous Debian :
apt-get install libgd-perl
et sous Mandrake/Mandriva :
urpmi perl-GD
Pour de la documentation, voir la page de manuel de GD.
Production d'une image simple
La première couleur définie correspond à la couleur de fond.
#!/usr/bin/perl -w use strict; use GD; # initialisation de l'image avec ses dimensions my $im = new GD::Image(200,200); # définition des couleurs utilisées my $white = $im->colorAllocate(255,255,255); my $red = $im->colorAllocate(255,0,0); my $blue = $im->colorAllocate(0,0,255); # fond transparent $im->transparent($white); $im->interlaced('true'); # début du dessin for (my $i=0 ; $i<250 ; $i++) { my $x = int(rand 200); my $y = int(rand 200); $im->arc($x,$y,2,2,0,360,$blue); # on fait des points } $im->setThickness(2); # épaisseur du trait my $px = 0; my $py = 0; for (my $x=0 ; $x<200 ; $x+=10) { my $y = int(rand 200); $y = 0 if ($y<0); $y = 199 if ($y>199); if ($px) { $im->line($px,$py,$x,$y,$red); # on trace des traits } $px = $x; $py = $y; } # on sort l'image open(PICTURE, ">hasard.png"); binmode PICTURE; print PICTURE $im->png; close PICTURE;
Surcharger une image existante
#!/usr/bin/perl -w use strict; use GD; # nouvelle image : 200x200 et fond gris my $im = new GD::Image(200,200); my $gray = $im->colorAllocate(192,192,192); my $green = $im->colorAllocate(0,255,0); $im->setThickness(2); # épaisseur du trait my $px = 0; my $py = 0; for (my $x=0 ; $x<200 ; $x+=10) { my $y = int(rand 200); $y = 0 if ($y<0); $y = 199 if ($y>199); if ($px) { $im->line($px,$py,$x,$y,$green); # on trace des traits verts } $px = $x; $py = $y; } # on reprend une image existante avec fond transparent et on la copie par dessus open(POINTS, "hasard.png"); my $overlay = newFromPng GD::Image(\*POINTS); close POINTS; $im->copy($overlay,0,0,0,0,200,200); # sortie de l'image finale open(PICTURE, ">surcharge.png"); binmode PICTURE; print PICTURE $im->png; close PICTURE;
Remplacer une couleur par une autre dans une image avec Perl
Il suffit de savoir que lorsque qu'une couleur est « désallouée », son code est utilisé pour la prochaine couleur définie.
#!/usr/bin/perl -w use strict; use GD; # on relit l'image open(POINTS,'surcharge.png'); my $im = newFromPng GD::Image(\*POINTS); close POINTS; # on change les couleurs $im->colorDeallocate($im->colorClosest(0,255,0)); # on supprime le vert $im->colorAllocate(218,112,214); # on remplace par du violet # sortie de l'image finale open(PICTURE, ">vert-violet.png"); binmode PICTURE; print PICTURE $im->png; close PICTURE;