FAQ PerlConsultez toutes les FAQ

Nombre d'auteurs : 18, nombre de questions : 250, dernière mise à jour : 29 octobre 2015  Ajouter une question

 

Bienvenue sur la FAQ Perl. Cette FAQ a pour vocation de vous enseigner ou de vous faire revoir les notions élémentaires de ce fantastique langage. Perl est très utilisé dans différents domaines depuis la gestion système, le réseaux, l'administration de bases de données, le web (CGI), la bureautique, la conception d'interfaces graphiques ou des contextes scientifiques telle la bioinformatique. Nous espérons que cette FAQ vous sera d'une grande utilité.

Vous souhaitez participer à l'amélioration de cette FAQ, n'hésitez pas !! Commentez

Bonne lecture !


SommaireProgrammation orientée objets en PerlMéthodes et accès aux champs (5)
précédent sommaire suivant
 

Vous avez déclaré un objet $dupond comme membre de la classe Humain, très bien. Maintenant il faudrait pouvoir avoir accès aux différents champs le concernant (son nom, son prénom, son âge...). Souvenez-vous que $dupond est une référence vers une table de hachage, il faut donc utiliser l'opérateur flèche pour accéder à ses différents champs. Par exemple, pour accéder au champ age de $dupond, il faut faire :

Code perl : Sélectionner tout
$dupond->{age}
Et si la variable est un tableau tab ?

Code perl : Sélectionner tout
1
2
3
$dupond->{tab}->[1]; 
#accède au second élément de @tab  . Équivalent à 
$dupond->{tab}[1];
De même pour une table de hachage.

Mis à jour le 8 février 2006 Woufeil

En Perl, une méthode n'est qu'une fonction recevant un premier paramètre un peu spécial. Une méthode d'instance recevra comme premier argument la référence vers l'objet sur lequel elle doit s'appliquer.
Supposons que cette référence pointe vers une table de hachage (c'est le cas la plupart du temps) et définissons une méthode defage permettant de définir l'âge de l'humain passé à cette méthode et de l'afficher :

Code perl : Sélectionner tout
1
2
3
4
5
6
sub defage 
{ 
   my ($this, $age ) = @_; 
   $this->{age} = $age; 
   print ''$this->{prenom} $this->{nom} a $this->{age} ans''; 
}
Il faut définir cette méthode dans le paquetage contenant la classe bien entendu !

Mis à jour le 8 février 2006 Woufeil

C'est pratiquement la même chose que pour appeler un constructeur ! Supposons que nous ayons créé un objet $dupond membre de la classe Humain via le constructeur associé. Si maintenant on veut appeler la méthode defage sur cet objet il suffit de taper :

Code perl : Sélectionner tout
$dupond->degafe(35);
Comme un appel de méthode lui passe (à la méthode) de lui-même son invoquant en tant que premier paramètre, il ne faut pas passer la référence $dupond. Ainsi, la fonction defage recevra bien $dupond comme premier paramètre et 35 en second. Ce n'est pas plus difficile que ça !

Mis à jour le 8 février 2006 Woufeil

On peut utiliser la fonction AUTOLOAD pour charger une méthode non définie. On peut s'en servir pour facilement générer des accesseurs et des mutateurs. Cela se fait ainsi :

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
sub AUTOLOAD { 
  our $AUTOLOAD; 
  return if $AUTOLOAD =~ /DESTROY/;    # vérifie que la méthode n'est pas le destructeur 
  my $this  = shift;                            # $this contient une référence à l'objet courant 
  my $champ = __PACKAGE__ . "::" . $AUTOLOAD; 
  die "Champ invalide" unless exists $self->{$champ};    # vérifie que le champ existe 
  if (@_) { $this->{$champ} = shift; }                   # on affecte la nouvelle valeur de champ à champ 
  return $self->{$champ};                                # retourne la valeur du champ considéré. 
}
Maintenant comment utiliser cette méthode via un objet $dupond ayant un attribut nom ?

Code perl : Sélectionner tout
1
2
$dupond->nom(); #retourne Dupond; 
$dupond->nom("Jean Dupond"); #affecte Jean Dupond à nom

Mis à jour le 22 juillet 2007 Woufeil

Les fermetures sont des puissants générateurs de fonctions pour peu que l'on boucle autour. On peut donc s'en servir pour générer des accesseurs/mutateurs du même type que ceux de la version AUTOLOAD :

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
foreach my $iteration ( "nom", "prenom", "age" ) { 
  my $nomcomplet = __PACKAGE__ . "::$iteration"; 
  no strict 'refs';    # pour l'instruction suivante 
  *$nomcomplet = sub { 
    my $this = shift; 
    $this->{$iteration} = shift if (@_); 
    return $this->{$iteration}; 
  }; 
}
Le principe est simple : mettez dans le foreach chaque champ pour lequel vous souhaitez qu'il dispose d'un accesseur et d'un mutateur. Rien ne change en ce qui concerne l'utilisation :

Code perl : Sélectionner tout
1
2
$dupond->nom(); # retourne Dupond; 
$dupond->nom("Jean Dupond"); # affecte Jean Dupond à nom

Mis à jour le 22 juillet 2007 Woufeil

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsable bénévole de la rubrique Perl : djibril -