Projet IDAPA

Accueil > Ressources > Perl 5 > Perl : les pointeurs et la fonction bless

Perl : les pointeurs et la fonction bless

lundi 11 janvier 2010, par LOISON

En premier lieu nous verrons comment on peut définir des pointeurs en Perl puis en second lieu pourquoi dans le langage de programmation Perl il existe des erreurs lorsque nous utilisons les pointeurs pour les associer à des objets , dans ce cadre nous verrons par la même occasion le rôle de la fonction "bless".

Les pointeurs dans PERL.

Dans la plupart des langages informatiques évolués comme le C, le C++, il existe des variables particulières : les pointeurs. Ces variables contiennent un nombre entier qui est l’adresse stockée dans la mémoire de l’ordinateur, la variable contenant l’adresse est reconnue par le langage ce qui nous permet facilement d’utiliser les pointeurs pour désigner le contenu de l’adresse comme étant des objets. Ci-dessous nous avons les différentes manières d’exprimer des pointeurs en Perl.

Pointeur sur une variable scalaire :

$var=234;
         
$p=\$var; # $p contiendra l'adresse de $var grâce à l'opérateur \

print $$p; # affiche 234

Pointeur sur un tableau :

@tableau = (2, 33, 444);          

$p=\@tableau; # $p contiendra l'adresse de base de @tableau

print @$p;# affiche 233444

print $$p[1];# affiche 33

on pourra aussi écrire :

print ${$p}[1]# affiche 33

print $p->[2]; # affiche 444       


Parfois l'ecriture avec les accolades est indispensable, par ex. :

sub adresse_de { return \$_[0];}
$g = 336;

$b=${adresse_de($g)};print $b;

Pointeur sur un tableau associatif :

%hash=("A",23,"T",34,"G",5,"C",8);
         
$p=\%hash; # $p contiendra l'adresse de base de %hash

print %$p;# affiche G5A23C8T34

print $$p{"T"};# affiche 34

print $p->{"C"}; # affiche 8

if (ref($p) ne 'HASH') {die "nécessite un pointeur de tableau associatif !, not $p\n";} # pour vérifier si $p est un pointeur sur un tableau
associatif.

Comme nous l’avons constater on peut définir des pointeurs avec des scalaires,des tableaux, et même des tableaux associatifs. Mais normalement l’adresse qui est un nombre entier ne peut être reconnue par le langage seulement si la variable définit est un scalaire, ce qui peut poser des problèmes lors de la mise en relation de pointeurs avec la fonction "bless" qui permet de définir le contenu à l’adresse du pointeur comme un objet.

Voici un exemple montrant le problème des pointeurs :

sub new {

@tableau = (2, 33, 444);

$p=\@tableau;#contient l'adresse du tableau

bless @$p;#définit le contenu à l'adresse du pointeur comme objet.

}

return $p;

Le problème ici est que le pointeur utilisé n’est pas un scalaire mais un tableau et pourtant cet abus de langage nous permet de l’écrire en passant au travers d’erreurs de programmation. Cependant le langage n’arrivera pas à associer le contenu désigné comme étant un objet car celui-ci ne verra pas que le contenu du pointeur est un entier mais des éléments du tableau.

En Perl il y a bien plusieurs manières d’écrire des pointeurs mais il faut tout de même faire attention à leur utilisation notamment lors de création de fonction qui se sert de la fonction "bless" pour créer des
bibliothèques .