Perl dispose de deux systèmes variables entièrement distincts mais largement compatibles, les variables de package, comme dans votre premier exemple, et lexical variables, comme dans la seconde. Il y a quelques petites choses que chacun peut faire, mais l'autre dévers:
Les variables de package sont les seuls qui peuvent être:
- localisée (avec
local
)
- utilisé comme cible pour une référence symbolique (la raison pour laquelle le travail deuxième exemple ne marche pas de OP)
- utilisé comme barewords (sous les définitions, les descripteurs de fichiers)
- utilisé avec typeglobs (parce que ce symbole est vraiment sous le capot)
Les variables lexicales sont les seules qui peuvent être fermées (utilisées dans une fermeture lexicale). L'utilisation de strict vous aidera à déclarer les variables de package avec our
, ce qui rendra la différence plus claire.
Il y a plusieurs moments où les références symboliques sont utiles en Perl, plus le centre autour de la manipulation de la table des symboles (comme écrire votre propre import
dans un module plutôt que d'utiliser Exporter
, modules ragréage singe lors de l'exécution, diverses autres tâches méta-programmation). Tous ces sujets sont avancés.
Pour d'autres tâches, il existe généralement une meilleure façon de le faire, par exemple avec un hachage. La règle générale est de toujours exécuter sous use warnings; use strict;
sauf si vous savez qu'il n'y a pas d'autre moyen que de désactiver une partie du pragma (par exemple en utilisant no strict 'refs';
dans une portée aussi réduite que possible).
Je suppose que $ answer définit une portée globale et my $ définit une portée locale. –
@Paul, mais print $ answer fonctionnerait bien ... comment $ {$ variable} crée-t-il une portée globale? – ennuikiller
Toujours utiliser 'use strict; utiliser des avertissements; 'et vous ne verrez jamais ce problème. Mieux encore, n'utilisez jamais la valeur d'une variable pour obtenir une autre variable. Les hachages sont bien meilleurs. – Ether