ProgrammationDéveloppeur Perl / Développeur principal pour le support des projets Perl

Expliquez comment fonctionnent le scope lexical et dynamique en Perl, lorsqu'on utilise my, local et our, et donnez des exemples de problèmes en cas de mauvaise compréhension de ces différences.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

En Perl, les variables peuvent avoir un scope lexical ou dynamique.

  • my crée une variable avec un scope lexical : la variable est visible uniquement à l'intérieur du bloc où elle est définie.
  • local redéfinit temporairement la valeur d'une variable globale (package) avec un scope dynamique : la nouvelle valeur est visible dans toutes les fonctions appelées jusqu'à ce que l'on quitte le bloc.
  • our définit une variable globale (package), mais visible uniquement dans le bloc lexical actuel.

Exemple :

our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # Affichera 10 — my $x n'est pas visible depuis inner $| = 1; test_loc(); # Affichera 30 — local $x est visible depuis inner

local est utilisé pour modifier des variables spéciales de package comme $_, $/, $@, etc.

Question piégée

Quel sera le résultat de l'exécution du code suivant et pourquoi ?

our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();

Réponse : Affichera 5. Parce que la variable my $a dans outer n'est pas visible depuis inner ; la variable de package $a, déclarée via our, est utilisée.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Dans un script d'analyse de journaux, des statistiques étaient enregistrées dans un hachage global à l'aide de local, pensant changer la valeur uniquement à l'intérieur du bloc. Il s'est avéré que la modification via local s'est propagée à d'autres parties du programme, entraînant une perte de données.

Histoire

Dans les tests modulaires, de nombreux développeurs redéfinissaient les variables spéciales globales comme $/ (séparateur de lignes) via my, ce qui entraînait l'absence de modifications, les tests échouant de manière étrange de manière partielle.

Histoire

Dans le développement en JavaScript, après être passés à Perl, les développeurs essayaient par habitude de déclarer des variables avec our partout sans nécessité, ce qui entraînait l'apparition de variables globales inattendues, nuisant à l'encapsulation et provoquant des conflits de noms.