Perl contient de nombreuses variables magiques (également appelées "spéciales" ou "systémiques"), qui influencent l'exécution du programme :
$_ — variable par défaut pour de nombreux opérateurs (foreach, map, grep, while <>, etc.).@_ — tableau des arguments d'entrée dans les sous-programmes.%SIG — hachage avec des gestionnaires de signaux du système d'exploitation.my @nums = (1,2,3); foreach (@nums) { $_ *= 2; # modifie le tableau original ! } sub show_args { print "Premier : ", $_[0], " "; } show_args('a','b'); # $_[0] = 'a' $SIG{INT} = sub { print "Interruption par Ctrl-C "; exit; };
Attention : de nombreuses variables magiques sont modifiées implicitement ; une mauvaise utilisation peut affecter l'état global du programme.
Peut-on utiliser en toute sécurité la variable globale $_ dans plusieurs boucles imbriquées ou sous-programmes ?
Réponse : Non, car une boucle imbriquée ou un sous-programme écrase souvent $_, entraînant une perte de valeur dans le contexte externe. Il est recommandé d'utiliser des variables explicites :
foreach my $x (@a) { foreach my $y (@b) { ... } }
Histoire
Dans un script de traitement de grands journaux, une boucle while(<FH>) {...} a été utilisée. À l'intérieur de la boucle, une fonction a été appelée qui, à son tour, exécutait map sans indiquer sa propre variable, ce qui a corrompu $_ dans la boucle externe, entraînant l'omission de lignes.
Histoire
Lors du traitement des signaux via %SIG, le développeur a remplacé le gestionnaire __DIE__, mais n'a pas pris en compte que cela affecte le comportement de tout le processus, y compris les modules externes, entraînant une terminaison incontrôlée lors d'erreurs dans du code tiers.
Histoire
L'optimisation du passage des arguments par référence au tableau (@_) dans le sous-programme et la tentative de modifier ses valeurs directement sans copie explicite ont conduit à une modification inattendue des variables dans le code externe.