Bonjour,
Je rencontre un problème concernant la visibilité des variables entre plusieurs modules utilisés dans un script.
Pour essayer d'y voir plus clair, j'ai simplifié la situation en un problème similaire mais plus basique.
J'ai un script main.pl qui utilise 2 modules, module_1.pm et module_2.pm.
Dans chacun de ces modules sont définies et instanciées 2 variables et une fonction, qui sont exportées :
$var_m1_1, $var_m1_2 et function_m1 dans le 1er module.
$var_m2_1, $var_m2_2 et function_m2 dans le 2eme module.
Je souhaite modifier ces variables de plusieurs façons :
- les 2 variables de m1 et les 2 variables de m2 dans le scripts main.pl, par une modification directe.
- les 2 variables de m1 modifiées dans une fonction de m2 mais appelée depuis main.pl
- les 2 variables de m2 modifiées dans une fonction de m1 mais appelée depuis main.pl
Comme on peut le vérifier avec les fichiers joints, les résultats ne sont pas symétriques, et je ne comprends pas pourquoi.
J'ai sans doute mal compris la notion de portée et de visibilité des variables, mais, tout ce que j'ai pu lire sur le sujet concerne en général les blocs et les appels de fonctions, mais ne reflètent pas des situations plus compliquées que l'on rencontre dès que l'on commence à programmer des applications précises.
Quelqu'un sait-il comment avoir une vision bien claire des différentes intéractions possibles entre les variables d'un script et celles des modules utilisés par celui-ci ainsi qu'entre les variables des modules eux-mêmes ?
Voici le code du script main.pl
Code de module_1.pm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #!/usr/bin/perl use strict; use warnings; use lib './Modules'; use module_1('$var_m1_1','$var_m1_2','function_m1'); use module_2('$var_m2_1','$var_m2_2','function_m2'); my $var_my_main = 1; print "\nvar_my_main=".$var_my_main."\n\n"; print "Variables du module 1 :\n"; print "var_m1_1 : ".$var_m1_1."\n"; print "var_m1_2 : ".$var_m1_2."\n"; print "\nVariables du module 2 :\n"; print "var_m2_1 : ".$var_m2_1."\n"; print "var_m2_2 : ".$var_m2_2."\n"; &function_m1(); print "\nVariables du module 2 modifees par module_1 :\n"; print "var_m2_1 : ".$var_m2_1."\n"; print "var_m2_2 : ".$var_m2_2."\n"; &function_m2(); print "\nVariables du module 1 modifees par module_2 :\n"; print "var_m1_1 : ".$var_m1_1."\n"; print "var_m1_2 : ".$var_m1_2."\n";
Code de module_2.pm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package module_1; use Exporter; # appel au module gérant la visibilité @ISA=('Exporter'); # hérite d'Exporter # Le tableau @EXPORT_OK est utilisé pour préciser les identificateurs qui sont visibles de l'extérieur du package. @EXPORT_OK=('$var_m1_1','$var_m1_2','function_m1'); use module_2('$var_m2_1','$var_m2_2'); $var_m1_1 = 11; $var_m1_2 = 12; sub function_m1 { $var_m2_1 = 121; $var_m2_2 = 122; } 1;Les 3 codes sont dans le zip joint
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package module_2; use Exporter; # appel au module gérant la visibilité @ISA=('Exporter'); # hérite d'Exporter # Le tableau @EXPORT_OK est utilisé pour préciser les identificateurs qui sont visibles de l'extérieur du package. @EXPORT_OK=('$var_m2_1','$var_m2_2','function_m2'); use module_1('$var_m1_1','$var_m1_2'); $var_m2_1 = 21; $var_m2_2 = 22; sub function_m2 { $var_m1_1 = 211; $var_m1_2 = 212; } 1;
Le résultat obtenu en lançant le script : perl main.pl est :
Pourquoi les variables de module_1 n'ont pas été modifiées par la fonction de module_2 ?
Partager