Initiation au Langage Perl


Suivant Précédent

  • Séance 4

  • Objectif
  • Recherche de cooccurrences dans un texte catégorisé ou non

    Utilisation d'expressions régulières. Repérer les agencements de catégories : constructions de règles de grammaires.

    Perl : apprentissage 4


    Variables globales, privées


    Variables globales

    Les déclarations de sous-programmes et de formats sont globales. Ces déclarations globales peuvent être placées partout oùl'on peut placer une instruction. Les déclarations sont mises typiquement au début ou a la fin du programme, ou dans un autre fichier.

    Une variable utilisée en un point du programme est accessible depuis n'importe où dans ce programme.

    Déclarations avec portée

    Comme les déclarations globales, les déclarations à portée lexicale ont un effet au moment de la compilation. Les déclaration à portée lexicale ont un effet depuis le point de leur déclaration jusqu'à la fin du bloc le plus interne les encadrant, d'où l'expression "à portée lexicale".

    Pour les variables privées à portée lexicale (créées par my), il faut donc s'assurer que la définition d'un sous-programme ou d'un format se trouve dans la même portée de bloc que le my si l'on désire accéder à ces variables.

    En Perl 4, l’instruction my n’est pas définie. On utilise l’instruction local pour définir une variable qui n’est pas présente dans le programme principal.

    En Perl 5, la forme la plus fréquente de déclaration à portée lexicale est la déclaration de variables my. Celle-ci définit une variable qui n’est pas présente dans le programme principal. L’instruction local définit une variable qui n’est pas présente dans le programme principal, mais à l’intérieur du sous-programme et de tous les sous-programmes appelés par celui-ci . Une variable créée par local est à portée dynamique, alors que les variables my sont à portée lexicale. La différence est que les variables dynamiques sont également visibles depuis les fonctions appelées à l'intérieur du bloc où ces variables ont été déclarées. Les variables lexicales, non. Elles sont totalement cachées du monde extérieur, y compris de tout sous-programme (même si le sous-programme s'est appelé lui-même; chaque instance du sous-programme reçoit sa propre copie des variables). Dans les deux cas, la variable (ou valeur locale) disparaît quant le programme sort de la portée lexicale dans laquelle le my ou le local se trouve. En général, il convient de préférer my à local parce qu'il est plus rapide et plus sûr. Mais il faut utiliser local si l'on veut changer temporairement la valeur d'une variable globale existante.


    Un my ou un local déclare que les variables listées (dans le cas de my) ou les valeurs des variables globales listées (dans le cas de local) sont confinées au bloc, au sous-programme, à l'eval ou au fichier qui les encadre. Si plus d'une variable est listée, la liste doit être placée entre parenthèses. Tous les éléments listés doivent être des lvalues légales
    (pour my, les contraintes sont encore plus strictes: les éléments doivent être de simples variables scalaires, tableaux ou hachages, et rien d'autre).

    Voici quelques exemples de déclarations de variables à portée lexicales:

    my $nom = "serge";
    my @trucs = ("voiture", "maison", "marteau");
    my ($vehicule, $maison, $outil) = @trucs;

    Ces déclarations effectuent également une assignation d'initialisation à l'exécution.

    La déclaration d'une variable lexicale d'un nom donné cache toute variable lexicale du même nom précédemment déclarée. Elle cache également toute variable globale non qualifiée du même nom, mais celle-ci reste toujours accessible en la qualifiant expressément avec le nom du package de la globale : $Package::variable.

    Une séquence d'instructions peut contenir des déclarations de variables a portée lexicale, mais à part déclarer les noms de variables, les déclarations agissent comme des instructions ordinaires et chacune d'entre elles est élaborée à l'intérieur de la séquence d'instructions comme s'il s'agissait d'une instruction ordinaire.