site de Fabien Torre


Pense-bêtes sur le langage Perl

Quelques trucs simples et utiles en 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;

Fabien Torre Valid HTML5! Valid CSS!
Accueil > Pense-bêtes > Technique > Trucs Perl
(contenu mis à jour )
site de Fabien Torre, université de Lille

Description

Survoler un lien de navigation pour lire sa description ici...