Un cours pour débuter en Perl


previous up contents next

Sous-sections


10. La portée des variables

Par défaut une variable Perl est globale, elle est donc visible dans l'ensemble du programme. De plus Perl n'oblige pas à déclarer les variables avant de les utiliser. Ces deux propriétés sont sources de bien des problèmes de mise au point, Perl permet donc de déclarer des variables locales et d'utiliser un mécanisme obligeant le programmeur à déclarer les variables avant de les utiliser.

Les programmeurs utilisant les langages de programmation les plus courants sont en général habitués à un fonctionnement différent : les variables sont automatiquement locales aux blocs de déclarations, pour les rendre globales, il est nécessaire de le préciser.

10.1 Déclarer des variables locales avec my

Il est possible de rendre locale une variable en précédent sa déclaration par my, elle ne sera alors connue que du bloc ou de la fonction (cf. section 11) qui contient sa déclaration. Les variables locales sont par défaut initialisées à undef10.1 et, il n'existe pas de variables locales statiques (celles dont la visibilité est limitée au bloc de déclaration mais dont la valeur est remanente d'une entrée dans le bloc à une autre).

  

#!/usr/local/bin/perl
$I = 10;
{
   my $I = 2;
   {
      $I++;
      {
         my $I = 4;
         printf ("I = %d \n",$I);  <==> Affiche I = 4
      }
      printf ("I = %d \n",$I);   <==> Affiche I = 3
   }
   printf ("I = %d \n",$I);    <==> Affiche I = 3
}
printf ("I = %d \n",$I);     <==> Affiche I = 10
  

10.2 Une autre manière de déclarer des variables locales

Les variables locales déclarées avec my ne sont visibles que dans leurs blocs de déclarations. Perl propose une autre variété de variables locales : celles qui en plus ont la particularité d'être visibles dans toutes les fonctions (cf. section 11) appelées depuis leurs blocs de déclarations.

  

#!/usr/local/bin/perl
$I = 4;            <==> cet I est global
{
  local $I = 2;
  fonc();          <==> Affiche I = 2
}
{
  my $I = 3;
  fonc();          <==> Affiche I = 4
}
sub fonc {printf("I = %d \n", $I);}
  

Les variables déclarées avec local ne contribuent pas à la lisibilité d'un code, elles peuvent même être source de confusions, il convient de ne pas les utiliser.


10.3 use strict

strict est un module de la bibliothèque standard de Perl, il permet de générer une erreur à la compilation si une variable accédée n'a pas été préalablement déclarée avec my (ou complètement qualifiée, ou importée cf. section 16).

  

#!/usr/local/bin/perl
my $Compteur=10;
$compteur++;               # erreur de frappe
print ('$Compteur = ',"$Compteur \n");
#     La valeur affichée est 10, le programmeur
#     peut ne pas s'en apercevoir.
  

  

#!/usr/local/bin/perl
use strict;
my $Compteur=10;
$compteur++;               # erreur de frappe
print ('$Compteur = ',"$Compteur \n");
# Un message d'erreur est généré à la compilation :
# Global symbol "$compteur" requires explicit package name
  

Dans l'exemple ci-dessus l'erreur de saisie est signalée car Perl n'autorise plus (use strict) les déclarations implicites de variables globales. Toutes les variables doivent être déclarées à l'aide de my (elles sont locales au programme principal) ou déclaréees dans un module externe (cf. section 16). L'utilisation de use strict est donc très fortement recommandée.


previous up contents next

FD