site de Fabien Torre, université de Lille


Pense-bêtes sur le langage Perl

Quelques trucs simples et utiles en Perl.


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

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...


Une photo au hasard

Découverte de la Corse.

Au sud d'Ajaccio.

(le 14 août 2007)

Au revoir Sartène.