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 !
Pour faire un héritage de classe en Perl, il suffit de créer dans la classe qui hérite un tableau nommé @ISA qui contiendra la ou les classes dont elle hérite ! Ce n'est pas plus compliqué que ça. Ce tableau sera déclaré avec our et non my. Le constructeur d'une telle classe contiendra un appel au(x) constructeur(s) de la (ou des) classe(s) dont elle hérite. Il obtiendra donc une référence consacrée, à laquelle il pourra rajouter ses propres variables, il consacrera à nouveau cette référence (il la liera avec la classe courante bien entendu) pour enfin la retourner.
Imaginons que le la classe Humain hérite d'une classe Animal qui définit les variables nom et age. A ces variables la classe Humain rajoutera la variable nationalité. On suppose que le constructeur de la classe Animal reçoit comme paramètre le nom et l'âge de l'animal à créer. Définissons le constructeur de la classe Humain qui recevra comme paramètre la nationalité de l'humain à créer.
Code perl : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package Humain; use strict; use Animal; # Humain se servant des variables et méthodes de Animal, il faut inclure Animal our @ISA = ("Animal"); # Le fameux tableau... sub consthumain { my ( $classe, $nat ) = @_; #la ligne suivante appelle le constructeur d'Animal my $this = $classe->SUPER::constanimal( "dupond", 35 ); $this->{nationalite} = $nat; # crée un champ age et lui affecte $nat bless $this, $classe; # lie la référence à la classe courante return $this; } |
Code perl : | Sélectionner tout |
my $dupond = Humain->consthumain("française");
Pour ça, Perl vous simplifie la vie. En C++ il faudrait déclarer des fonctions virtuelles, ici nul besoin de faire quoi que ce soit, Perl choisira automatiquement la méthode la plus appropriée en fonction de l'invoquant. Comment ? Perl cherchera tout d'abord dans la classe de l'invoquant si la méthode invoquée existe. Si ce n'est pas le cas, Perl prendra le premier membre du tableau @ISA (qui sera donc une classe mère) et cherchera s'il existe une méthode correspondante dans cette classe, et ainsi de suite avec les autres classes mères en cas d'héritage multiple. Rappelez-vous du premier paramètre des méthodes et du fait qu'une référence "sait" à quelle classe appartient l'objet vers lequel elle pointe. Cela permet de comprendre comment le polymorphisme est mis en oeuvre aussi facilement.
Oui, bien sûr ! Rappelez-vous, @ISA est un tableau, il ne contient pas forcément qu'un seul élément. Tous les éléments de @ISA sont les classes mères de la classe dans laquelle ce tableau est déclaré.
Il y a un petit problème lors de la destruction d'un objet dont la classe hérite d'autres classes en Perl. En effet, dans ce cas, seul le destructeur de l'objet est appelé alors que normalement les destructeurs des classes mères devraient l'être également. La solution consiste à faire un appel direct du destructeur des classes mères dans le destructeur de la classe fille. Par exemple, si le destructeur reçoit une référence $this comme premier paramètre, l'appel se fera ainsi :
Code perl : | Sélectionner tout |
$this->SUPER::DESTROY();
Parlons déjà des portées des variables de module. Si dans un module Mod1 vous avez créé une variable $var que vous avez déclarée avez my, elle ne sera accessible qu'au sein même du module. Mais si vous l'avez déclarée avec our, elle le sera aussi à l'extérieur du module. Comment y accéder ? Avec l'opérateur :: et en utilisant cette syntaxe :
Code perl : | Sélectionner tout |
1 2 | $Mod1::var; #Attention, Mod1::$var est incorrect ! |
Code perl : | Sélectionner tout |
Mod1::fn();
Code perl : | Sélectionner tout |
<nom du module>::<nom de la variable ou de la fonction. Le symbole du type de variable sera rajouté au début de l'instruction>
Vous avez sûrement remarqué que les modules se terminent souvent par un étrange 1. Comme vous le savez, 1 est une valeur "vrai", à l'inverse de 0 ou de undef. Lors de l'exécution de la directive use, le code du module est exécuté sauf si Perl rencontre une valeur "faux" suivie d'un point virgule. Une valeur "faux" indiquera qu'il y a eu une erreur lors du chargement du module, un "vrai" que tout s'est bien passé, d'où l'ajout du 1; à la fin de chaque module.
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 çaLes 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 © 2024 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.