Bonjour,
J'utilise un fichier de configuration Config.ini géré par Config::Std dans un programme de gestion de messagerie.
Je contrôle les spams dans le programme et je stocke quelques stats dans Config.ini [SENDER] = (Key=@Mail; Value=(Date du dernier spam, Nb de spams).
Je peux sans pb ajouter une clé ou modifier sa valeur lorsque je le fais au coup par coup : sub StatsAdrRefus.
Cependant je n'arrive pas à le faire dans un boucle en vue de trier les valeurs pour en faciliter la lecture dans le fichier Config.ini.
Même si un hash n'a pas à être trié... et puisque lorsque les ajouts sont faits au fil de l'eau ça fonctionne...
J'ai fait un extrait du pb.
Voici le fichier Config.ini initial :
Config.pl :
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 [GLOBAL] RestructStats: NON DatStatMin: 2018/06/01 ############################################################ ############################################################ [SENDER] craftaway: 2018/07/17 185 ultimain: 2018/07/16 22 info@free.fr: 2018/07/12 1 mailody-md: 2018/07/06 2 sustainohio: 2018/07/15 3 dealsnewyork: 2018/07/04 12 canal-u: 2018/07/04 1 ScientificSmart: 2018/06/29 1 ekaunseling: 2018/06/28 9 ebay: 2018/06/27 2 cleanspecials: 2018/06/27 2 footballstyles: 2018/06/27 1 FortuneSpeed: 2018/06/26 1 specialsecure: 2018/06/25 1 positivefree: 2018/06/24 1 discreetteam: 2018/06/24 1 malagasnews: 2018/06/23 1 freetelecom: 2018/06/21 1 profitlimited: 2018/06/20 1
Lorsque RestructStats: NON, ça se passe bien titi et tata sont créés à la suite dans [SENDER], tata est incrémenté :
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 #!/usr/bin/perl use strict; use warnings; use utf8; use File::Spec; # Gestion des noms des chemins sous tous les OS use Config::Std { def_gap => 0 }; # Lecture/ecriture d'un fichier .ini my $RepBase = 'E:/_APPLI/Mail/Spam'; # Date_Heure où c'est nécessaire my ( $Date_Heure, $DatRep, $DatStats ) = date(); # Lecture du fichier de configuration my $Mail = File::Spec->catfile( $RepBase, 'Config.ini' ); my %Mail_Ini; if ( -e $Mail ) { read_config $Mail => %Mail_Ini; } else { print "Absence fichier : $Mail : \n\t $! \n"; exit; } # Au coup par coup ça se passe bien : my $Refus = 'titi@toto.fr'; StatsAdrRefus ( $Refus, $DatStats ); $Refus = 'tata@tutu.com'; StatsAdrRefus ( $Refus, $DatStats ); $Refus = 'tata@tutu.com'; StatsAdrRefus ( $Refus, $DatStats ); # Là ça ne va plus if ( $Mail_Ini{GLOBAL}{RestructStats} eq 'OUI' ){ RestructStats ( $Mail_Ini{GLOBAL}{DatStatMin} ); } ######################### # MàJ stats dans Mail.ini ######################### # Si Key n'existe pas elle est crée avec Nb 1 # Sinon elle est modifiée NB est incrémenté sub StatsAdrRefus { my ( $Refus, $DatStats ) = @_; if (!$Mail_Ini{SENDER}{$Refus}) { $Mail_Ini{SENDER}{$Refus} = "$DatStats 1"; } else { my ($Bidon, $Nb) = split / /, $Mail_Ini{SENDER}{$Refus}; $Nb ++; $Mail_Ini{SENDER}{$Refus} = "$DatStats $Nb"; } write_config %Mail_Ini, $Mail; } ########################### # Restructuration des Stats # SENDER RETURN NOIRES ########################### sub RestructStats { my ( $DatStatMin ) = @_; my @AdrRefus = %Mail_Ini{SENDER}; my ( $Rubrique, $Hash ) = @AdrRefus; print "RUBRIQUE-$Rubrique-\n"; #while( my ($k,$v) = each(%$Hash) ) { # print "Clef=$k Valeur=$v\n"; #} my @Tableau; while( my ($k,$v) = each(%$Hash) ) { my ( $Date, $Nb ) = split / /, $v; if ( $Date gt $Mail_Ini{GLOBAL}{DatStatMin} ) { push @Tableau, [$k, $Date, $Nb]; } } print "\nDELETE ou UNDEF SENDER\n"; $Mail_Ini{SENDER} = undef; my @out = sort { $b->[1] cmp $a->[1] || $b->[2] <=> $a->[2] || $b->[0] cmp $a->[0] } @Tableau; foreach my $Ligne ( @out ) { #print "==--$Ligne--==\n"; ## En fait c'est un tableau avec les 3 éléments par Ligne my $Liste = join(" ", @$Ligne); my ( $Refus, $DatStats, $Nb ) = split / /, $Liste; print "==$Refus=$DatStats=$Nb==\n"; #StatsAdrRefus ( $Refus, $DatStats ); $Mail_Ini{SENDER}{$Refus} = "$DatStats $Nb"; write_config %Mail_Ini, $Mail; #sleep 1; } #write_config %Mail_Ini, $Mail; } #=================================================================== # Date et Heure (Modifié pour avoir 3 formats en sortie) # ORIGINAL : http://perl.developpez.com/faq/perl/?page=section3#date #=================================================================== sub date { my $time = shift || time; #$time par defaut vaut le time actuel my ( $seconde, $minute, $heure, $jour, $mois, $annee, $jour_semaine, $jour_annee, $heure_hiver_ou_ete ) = localtime($time); $mois += 1; $annee += 1900; # On rajoute 0 si le chiffre est compris entre 1 et 9 foreach ( $seconde, $minute, $heure, $jour, $mois, $annee ) { s/^(\d)$/0$1/; } return ("Le $jour/$mois/$annee A $heure:$minute:$seconde", "/$mois$jour-$heure$minute", "$annee/$mois/$jour"); }
A l'issue lorsque RestructStats: OUI, je ne retrouve dans Config.ini que la première ligne de la Key du tableau trié :
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 [GLOBAL] RestructStats: NON DatStatMin: 2018/06/01 ############################################################ ############################################################ [SENDER] craftaway: 2018/07/17 185 ultimain: 2018/07/16 22 info@free.fr: 2018/07/12 1 mailody-md: 2018/07/06 2 sustainohio: 2018/07/15 3 dealsnewyork: 2018/07/04 12 canal-u: 2018/07/04 1 ScientificSmart: 2018/06/29 1 ekaunseling: 2018/06/28 9 ebay: 2018/06/27 2 cleanspecials: 2018/06/27 2 footballstyles: 2018/06/27 1 FortuneSpeed: 2018/06/26 1 specialsecure: 2018/06/25 1 positivefree: 2018/06/24 1 discreetteam: 2018/06/24 1 malagasnews: 2018/06/23 1 freetelecom: 2018/06/21 1 profitlimited: 2018/06/20 1 titi@toto.fr: 2018/07/18 1 tata@tutu.com: 2018/07/18 2
Pourtant le principe est le même et le code identique !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 [GLOBAL] RestructStats: OUI DatStatMin: 2018/06/01 ############################################################ ############################################################ [SENDER] tata@tutu.com: 2018/07/18 4
J'ai essayé pas mal de choses dont :
- la manipulation du hash par référence selon la doc du module :
- Stocké les modifs dans un tableau, puis affecter le tableau : $Mail_Ini{SENDER} = @ESS;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 require Config::Std; Config::Std->import; my %config; read_config($file, \%config); write_config(\%config, $file);
- Transformé @ESS en %H puis l'affecter : $Mail_Ini{SENDER} = %H;
- Appelé StatsAdrRefus ( $AdrSender, $DateDer ); DANS sub RestructStats
- ajouté un sleep entre chaque écriture
...
Je ne comprends pas pourquoi ça fonctionne au coup par coup et non dans une boucle.
Pour le moment je contourne le pb en :
- réalisant un fichier.txt indépendant qui contient la clé [SENDER] triée
- en supprimant la clé [SENDER] dans Config.ini
puis en prenant Config.ini comme simple fichier texte dans un autre programme et en lui ajoutant le fichier.txt :
RestructStats.pl :
Ça fait un peu bourrin, et surtout ce n'est pas très béton si j'oublie de passer RestructStats.pl !
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 #!/usr/bin/perl use strict; use warnings; use utf8; use File::Spec; # Gestion des noms des chemins sous tous les OS my $RepBase = 'E:/_APPLI/Mail/'; my $fichier_Ini = File::Spec->catfile( $RepBase, 'Config.ini' ); my $fichier_StatsTmp = File::Spec->catfile( $RepBase, 'StatsTmp.ini' ); my $fh_Ini; open($fh_Ini,'>>:utf8', $fichier_Ini) or die Ano("Erreur sur ouverture fichier Mail.ini : $fichier_Ini : \n\t $! \n"); my $fh_StatsTmp; open($fh_StatsTmp,'<:utf8', $fichier_StatsTmp) or die Ano("Erreur sur ouverture fichier StatsTmp : $fichier_StatsTmp : \n\t $! \n"); while ( my $Ligne = <$fh_StatsTmp> ) { print $fh_Ini $Ligne; } close $fichier_Ini; close $fichier_StatsTmp; exit;
Si vous avez de meilleures idées je suis tout ouie
Autant c'est gros comme un âne, mais je ne vois pas où le bât blesse
Désolé d'avoir été autant prolixe, mais c'est pour vous éviter l’utilisation la boule de cristal
MERCI d'avance !
Partager