Salut,
Je crois avoir saisi l'essentiel en ce qui concerne la confidentialité des variables dans les programmes perl, mais je me pose quelques questions au sujet des appels de fonctions à partir d'autres fonctions, et en particulier à propos de l'usage des références dans ce cas de figure précis. Prenons le code suivant :
La sortie est :
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 #!/usr/bin/perl -w use strict; my ($a,$b) = (0,1); &function1($a); &function2($b); sub function1 { my $arg1 = shift; print "$arg1\n"; } sub function2 { my $arg2 = shift; print "$arg2\n"; &function1($a); }
0
1
0
La variable $a est donc bien "vue" dans le corps d'une fonction elle-même imbriquée dans une autre fonction (ce qui paraît normal, pas de surcharge locale, tout ça...)
Le problème est que je n'arrive pas à obtenir le même comportement avec l'usage de références. J'écris un démon perl et je souhaite qu'il relise sa conf en recevant un signal SIGHUP. D'une façon générale, le démon lit sa conf à partir d'un fichier par le biais de la procédure get_conf :
J'ai donc écrit le handler suivant :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 # Mailer my $mailer = {}; # Logger my $logger = {}; # Cibles my $http_hosts = []; my $smtp_hosts = []; my $imap_hosts = []; &get_conf ($mailer,$logger,$http_hosts,$smtp_hosts,$imap_hosts); sub get_conf { my $mailer = shift; my $logger = shift; my $http_hosts = shift; my $smtp_hosts = shift; my $imap_hosts = shift; my $conf = AppConfig -> new ( 'mailer_smtp' => {ARGCOUNT => 1}, 'mailer_sender' => {ARGCOUNT => 1}, 'mailer_recipient' => {ARGCOUNT => 1}, 'logger_ident' => {ARGCOUNT => 1}, 'logger_logopt' => {ARGCOUNT => 1}, 'logger_facility' => {ARGCOUNT => 1}, 'http_host' => {ARGCOUNT => ARGCOUNT_LIST}, 'smtp_host' => {ARGCOUNT => ARGCOUNT_LIST}, 'imap_host' => {ARGCOUNT => ARGCOUNT_LIST} ); $conf -> file ('/etc/monitor/monitor.conf'); # Mailer $mailer->{SMTP} = Net::SMTP -> new ($conf -> mailer_smtp ()); $mailer->{SMTP} -> mail ($conf -> mailer_sender ()); $mailer->{SMTP} -> to ($conf -> mailer_recipient ()); $mailer->{SENDER} = $conf -> mailer_sender (); $mailer->{RECIPIENT} = $conf -> mailer_recipient (); # Logger $logger->{IDENT} = $conf -> logger_ident (); $logger->{LOGOPT} = ''; $logger->{FACILITY} = $conf -> logger_facility (); # Cibles @$http_hosts = @{$conf -> http_host ()}; @$smtp_hosts = @{$conf -> smtp_host ()}; @$imap_hosts = @{$conf -> imap_host ()}; }
Cela ne fonctionne pas, j'obtiens les erreurs suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 sub sig_hup { &get_conf ($mailer,$logger,$http_hosts,$smtp_hosts,$imap_hosts); } $SIG{HUP} = \&sig_hup;
Global symbol "$mailer" requires explicit package name at ./monitor_test.pl line 62.
Global symbol "$logger" requires explicit package name at ./monitor_test.pl line 62.
Global symbol "$http_hosts" requires explicit package name at ./monitor_test.pl line 62.
Global symbol "$smtp_hosts" requires explicit package name at ./monitor_test.pl line 62.
Global symbol "$imap_hosts" requires explicit package name at ./monitor_test.pl line 62.
Execution of ./monitor_test.pl aborted due to compilation errors.
Quelqu'un pourrait-il m'en dire plus, je ne comprends pas trop cette différence de comportement entre variables et références.
Merci pour vos réponses !
Partager