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

Langage Perl Discussion :

Récupérer valeurs persistantes (Storable)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 40
    Par défaut Récupérer valeurs persistantes (Storable)
    Le but de mon programme est de faire un bilan, à chaque run, des fichiers modifiés/nouveaux/effacés depuis le dernier run dudit programme.
    Je stocke dans un fichier log un tableau associatif "nom de fichier->hashcode" (à l'aide de Storable, les hash étant générés avec le module Digest::MD5 et les noms de fichiers récupérés avec File::Find...).
    J'ai donc un fichier log dont les lignes ressemblent à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d7a484bb05991519cd3812abd2792a1dA^@^@^@/home/moi/test/monfichier.png
    Lors de chaque run, je veux, pour chaque fichier du répertoire analysé, vérifier si le hashcode correspondant à ce fichier est équivalent à celui enregistré dans mon log.
    Donc ça donnerait, selon moi :
    Code perl : 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
    #!/usr/bin/perl
    
    use strict;
    use File::Find;
    use Digest::MD5;
    use Getopt::Std;
    use Storable qw/store_fd fd_retrieve retrieve/;
    
    my %hash;
    my $hashref;
    
    #Test pour premier run (création fichier log)
    if(! -e "test.log") {
    	foreach(@ARGV) {
    		&File::Find::find(\&addFileInList,"$_");
    	}
    	open(LOG,">test.log");
    	store_fd(\%hash, *LOG);
    	close(LOG);
    }
    #Sinon...
     else {
    	open(LOG,"+<test.log");
    	my $hashref = fd_retrieve(*LOG);
    	
    	foreach(@ARGV) {
    		&File::Find::find(\&checkFile,"$_");
    	}
    	
    	close(LOG);
    }
    
    #Ajoute un couple "nom de fichier"-"hashcode" à la liste
    sub addFileInList {
        return unless -f $_;
        my $file = shift || $_;
        
        open(FILE,$file) or die "File error : can't open '$file': $!";
        binmode(*FILE);
        $hash{$File::Find::name} = Digest::MD5->new->addfile(*FILE)->hexdigest;
        close(FILE);
    }
    
    #Vérifie si fichier présent dans la liste et modifié
    sub checkFile {
    	return unless -f $_;
    	my $file = shift || $_;
    	my $fileName = $File::Find::name;
    	
    	if(exists($hashref->{$fileName})) {	
    		open(FILE,$file) or die "File error : can't open '$file': $!";
    		binmode(*FILE);
    		my $hashKey = Digest::MD5->new->addfile(*FILE)->hexdigest;
    		close(FILE);
    		
    		if(! $hashref->{$fileName} eq $hashKey) {
    			print "Fichier modifié : ",$fileName,"\n";
    			$hashref->{$fileName} = $hashKey;
    		}
    	}
    }

    Bref, ça ne fonctionne évidemment pas... Et je suppose que je n'ai juste strictement rien compris à Storable (et que la partie en gras dans le code n'a aucun sens)...
    Quelqu'un peut m'indiquer une piste vers une solution ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    La première erreur se trouve là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	my $hashref = fd_retrieve(*LOG);
    Le my rend ton affectation locale.

    Cependant, cela ne suffit pas à corriger, car dans le File::Find, $hashref devient undef...
    Je cherche encore

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    La deuxième erreur est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		if(!($hashref->{$fileName} eq $hashKey)) {
    Il faut respecter la précédence des opérateurs. Dans ce que tu avais écrit, le ! s'appliquait uniquement à $hashref->{$fileName}.

    De même, en fin de "check", il faut à nouveau sauver le hash pour la prochaine vérification dans le cas où certaines auraient été mises à jour.

  4. #4
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 40
    Par défaut
    Merci beaucoup!
    En fait, le vrai gros problème résidait dans l'utilisation de store_fd et fd_retrieve...
    Maintenant j'utilise store et retrieve et ça fonctionne.
    Maintenant, si quelqu'un a envie de m'expliquer pourquoi, ça m'intéresse aussi

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    j'ai utilisé les versions fd de Storable, et je n'ai pas trouvé de problème... quel était le problème ?

  6. #6
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 40
    Par défaut
    Le problème était... que ça ne fonctionnait pas...
    Maintenant le "pourquoi ça fonctionne avec store et retrieve et pas avec store_fd et fd_retrieve"... Aucune idée...

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

Discussions similaires

  1. [POI]Récupérer valeur cellule suivant format
    Par leminipouce dans le forum Documents
    Réponses: 1
    Dernier message: 27/10/2005, 08h52
  2. Récupérer valeur contrôle en dynamique via requête
    Par nicburger dans le forum Access
    Réponses: 10
    Dernier message: 15/09/2005, 15h41
  3. [ActionScript] Récupérer valeur balise <param />
    Par JohnBlatt dans le forum Flash
    Réponses: 1
    Dernier message: 18/07/2005, 14h50
  4. CR9 - Récupérer valeurs multiples d'un champ paramètre
    Par CR9-Deb dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 06/07/2005, 16h08
  5. récupérer valeur d'un ID après insertion
    Par rikidi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/08/2003, 22h21

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