Comment surcharger un opérateur en Perl
Jusqu’à il y a 1 heure, je croyais qu’une telle alchimie n’était pas possible en Perl (seul C++ le faisait dans mon petit esprit de jeunot) mais il est bel et bien possible de surcharger un opérateur en Perl.
Le pire, et ça va vous surprendre, c’est que ça n’est même pas diffcile !
La déclaration de la surcharge se fait grâce à l’utilisation d’un use particulier : “use overload” (l. 21 dans l’exemple) qui permet d’assigner une fonction à un opérateur.
Il y a juste quelques conditions à respecter pour pouvoir faire ce petit tour de magie :
- être en contexte d’objet, ainsi on surcharge l’opérateur appliqué à l’objet
- la fonction qui est mappée sur l’opérateur surchargé doit retourner l’objet modifié
Voici un petit exemple pour illustrer ce propos. Nous allons surcharger l’opérateur + appliqué à notre objet.
1 #!/usr/bin/perl
2 use strict;
3 package classe;
4
5 sub new
6 {
7 my ($class,$data) = (@_);
8 my $self = {
9 valeur => 0
10 };
11 bless ($self,$class);
12 return $self;
13 }
14
15 sub valeur
16 {
17 my $self = shift;
18 return $self->{valeur};
19 }
20
21 use overload (
22 '+' => 'ma_fonction_qui_fait_plus'
23 );
24
25 sub ma_fonction_qui_fait_plus
26 {
27 my $self = shift;
28
29 my ($value) = @_;
30
31 print "vous faite un ajout de $value
";
32 $self->{valeur} += $value;
33 return $self;
34 }
35
36 # exemple d'utilisation
37 my $objet = new classe();
38 print "valeur : " . $objet->valeur() . "
";
39
40 $objet++;
41 print "valeur : " . $objet->valeur() . "
";
42 exit;
Ce qui nous donne l’exécution suivante :
$ perl /tmp/test.pl valeur : 0 vous faite un ajout de 1 valeur : 1 $
alt="photo de mars"