Histoire de la question :
En Perl, l'espace de noms est le principal moyen d'isoler les variables et les fonctions entre les différentes parties d'un programme. Grâce à la directive package, des zones indépendantes sont créées, chacune recevant son propre ensemble de variables et de fonctions globales. Cela permet de développer des projets multi-fichiers sans conflits de noms.
Problème :
Une mauvaise gestion de la portée, le mélange de variables lexicales et de variables de package, ou un mauvais travail avec l'espace de noms "main" conduit souvent à des problèmes : apparition de variables inattendues, écrasement de fonctions, bugs non évidents dans les taxes et tests.
Solution :
package SomeName;.my) ne sont visibles que dans le bloc, tandis que les globales (our, anciennement use vars) le sont dans tout le package.AnotherPackage::some_function().Exemple de code :
package MyApp::Utils; our $global_var = 10; sub do_something { return $global_var + 1; } package main; print MyApp::Utils::do_something(); # 11
Caractéristiques clés :
:: pour accéder aux ressources d'un autre.main est l'espace global par défaut pour les scripts.Quelle est la différence entre my, our et local dans les packages ?
my — seulement dans le bloc lexical actuel.our — déclare une variable globale du package, mais la rend accessible comme référence lexicale dans le bloc.local — redéfinit temporairement la valeur globale d'une variable de package pendant la durée de l'existence du bloc.Peut-on appeler une fonction sans indiquer explicitement le package ?
Oui, si la fonction est exportée dans le package actuel à l'aide du module Exporter et use, sinon — uniquement via le nom complet.
Peut-on déclarer plusieurs package dans un seul fichier ?
Oui, mais cela peut être difficile à comprendre — après chaque package, toutes les déclarations suivantes appartiennent au nouvel espace de noms. Il vaut mieux utiliser des fichiers séparés pour chaque package.
Dans un script d'équipe, plusieurs packages étaient utilisés successivement, au sein d'un même fichier ; les variables étaient confondues, parfois lexicales, parfois globales.
Avantages :
Inconvénients :
Chaque package a été déplacé dans son propre module, les fonctions étaient explicitement exportées.
Avantages :
Inconvénients :