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.
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.
Histoire
Histoire
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.