IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

Config::Std Ajout Key & Value


Sujet :

Modules Perl

  1. #1
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut Config::Std Ajout Key & Value
    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 :
    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
    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
    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");
    }
    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
    [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
    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
    [GLOBAL]
     
    RestructStats: OUI
    DatStatMin: 2018/06/01
     
    ############################################################
    ############################################################
    [SENDER]
    tata@tutu.com: 2018/07/18 4
    Pourtant le principe est le même et le code identique !

    J'ai essayé pas mal de choses dont :
    - la manipulation du hash par référence selon la doc du module :
    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);
    - Stocké les modifs dans un tableau, puis affecter le tableau : $Mail_Ini{SENDER} = @ESS;
    - 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 :
    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;
    Ça fait un peu bourrin, et surtout ce n'est pas très béton si j'oublie de passer RestructStats.pl !
    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 !

  2. #2
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Je n'ai pas d'explication au pb, mais je l'ai contourné plus confortablement, sans passer par un programme intermédiaire.
    Initialement je ne trouvais pas très opportun de manipuler le fichier Config.ini alors qu'il était utilisé par le module.

    M'enfin ça marche :
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    #!/usr/bin/perl
    use strict;
    use Carp;
    use warnings;
    use utf8;
    use Data::Dumper;
    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';
    my $fichier_Ini        = File::Spec->catfile( $RepBase, 'Config.ini' );
    # Date_Heure où c'est nécessaire
    my ( $Date_Heure, $DatRep, $DatStats ) = date();
     
    my $fh_Ini;
    open($fh_Ini,'>>:utf8', $fichier_Ini)
    	or die Ano("Erreur sur ouverture fichier Mail.ini : $fichier_Ini : \n\t $! \n");
     
     
    # 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;
    }
     
    my $Refus = 'titi@toto.fr';
    StatsAdrRefus ( $Refus, $DatStats );
     
    $Refus = 'tata@tutu.com';
    StatsAdrRefus ( $Refus, $DatStats );
    $Refus = 'tata@tutu.com';
    StatsAdrRefus ( $Refus, $DatStats );
     
     
    if ( $Mail_Ini{GLOBAL}{RestructStats} eq 'OUI' ){
    	RestructStats ( $Mail_Ini{GLOBAL}{DatStatMin} );
    }
     
    close $fichier_Ini;
    exit;
     
    #########################
    # MàJ stats dans Mail.ini
    #########################
    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 ) = @_;
     
    	print Dumper (%Mail_Ini{SENDER});
     
    	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 "\nTABLEAU\n";
    	print Dumper(@Tableau);
     
    	print "\nDELETE ou UNDEF SENDER\n";
    	$Mail_Ini{SENDER} = undef;
    	write_config %Mail_Ini, $Mail;
     
    	print $fh_Ini "[SENDER]\n";
     
    	my @out = sort { $b->[1] cmp $a->[1] || $b->[2] <=> $a->[2] || $b->[0] cmp $a->[0] } @Tableau;
     
    	foreach my $Ligne ( @out ) {
    		my $Liste = join(" ",@$Ligne);
    		my ( $AdrSender, $DateDer, $Nb ) = split / /, $Liste;
    		print "==$AdrSender=$DateDer=$Nb==\n";
    		print $fh_Ini "$AdrSender: $DateDer $Nb\n";
    	}
    }
     
     
     
    #===================================================================
    # 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");
    }
    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: OUI
    DatStatMin: 2018/06/01
     
    [SENDER]
    tata@tutu.com: 2018/07/18 2
    titi@toto.fr: 2018/07/18 1
    craftaway: 2018/07/17 185
    ultimain: 2018/07/16 22
    sustainohio: 2018/07/15 3
    info@free.fr: 2018/07/12 1
    mailody-md: 2018/07/06 2
    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
    Pour moi le pb est résolu, mais si vous avez une explication, je suis preneur !
    Encore MERCI !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Associer automatiquement $key et $value d'un array
    Par dldstyle dans le forum Langage
    Réponses: 6
    Dernier message: 22/07/2010, 13h28
  2. [Hashtable]Recuperer les keys grace à Value
    Par kululu dans le forum Général Java
    Réponses: 5
    Dernier message: 15/04/2010, 10h46
  3. fichier de config XML à ajouter au JAR
    Par Balbuzard dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 03/12/2008, 22h05
  4. App.config : du xml dans une value
    Par blasme dans le forum C#
    Réponses: 4
    Dernier message: 25/01/2008, 07h39
  5. [Config] Comment ajouter un répertoire supplémentaire de dlls ?
    Par maitrebn dans le forum Framework .NET
    Réponses: 8
    Dernier message: 21/06/2006, 08h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo