hilpers


  hilpers > comp.lang.* > comp.lang.perl

 #1  
14/05/2010, 12h23
kurtz_le_pirate
bonjour,

j'ai deux hash.

le premier :
my %SrcDatas;
il est repli avec :
$SrcDatas{$nom_du_fichier}=$MD5_du_fichier;

le deuxième :
my %Datas;
il est rempli avec :
$Datas{$nom_du_fichier}{$nom_du_serveur}=$MD5_du_f ichier;

rien de bien complique. mon but maintenant est de comparer pour
chaque serveur, que la liste des fichiers soit identique (même
nombre, même nom, même MD5) que ceux dans %SrcDatas.


existe-t-il un module perl pour comparer des 'hash' facilement
ou bien je dois faire une boucle pour chaque serveur, dans
laquelle je fais une boucle pour chaque fichier qui compare les
noms, les MD5... ?

aurais-je du choisir un autre modele de données ?


merci de votre avis.
 #2  
15/05/2010, 08h22
Paul Gaborit
À (at) Fri, 14 May 2010 14:23:11 +0200,
"kurtz_le_pirate" <kurtzlepirate> écrivait (wrote):

[..]
> chaque serveur, que la liste des fichiers soit identique (même
> nombre, même nom, même MD5) que ceux dans %SrcDatas.
>> existe-t-il un module perl pour comparer des 'hash' facilement

> ou bien je dois faire une boucle pour chaque serveur, dans
> laquelle je fais une boucle pour chaque fichier qui compare les
> noms, les MD5... ?
>
> aurais-je du choisir un autre modele de données ?


Il est souvent intéressant de faire ce genre de tests lorsqu'on collecte
les données plutôt qu'à posteriori comme ça les boucles sont déjà
réalisées implicitement... Mais supposons que ce n'est pas faisable.

La méthode à choisir dépend beaucoup du résultat attendu. On ne
procédera pas de la même manière selon qu'on attend une réponse du
type :

1- oui(tout est pareil)/non(il y a des différences).
2- tel serveur est différent des données locales.
3- pour chaque serveur, la liste des fichiers en trop, la liste des
fichiers manquants, la liste des fichiers dont le MD5 différe.

Je suppose aussi qu'on dispose aussi de la liste des serveurs
(@serveurs).

Une solution qui donne des réponses détaillées pourrait être la suivante
(je n'ai pas testé le code) :

# recherche des fichiers manquants ou différents
my %fichiers_manquants;
my %fichiers_differents;
foreach my $local_file (keys %SrcDatas) {
if (not defined $Datas{$local_file}) {
# le fichier n'existe sur aucun serveur
$fichiers_manquants{$local_file} = [@serveurs];
next;
}
foreach my $serveur (@serveurs) {
if (not defined $Datas{$local_file}{$serveur}) {
# le fichier n'existe pas sur $serveur
push @{$fichiers_manquants{$local_file}}, $serveur;
} elsif ($Datas{$local_file}{$serveur}
ne $SrcDatas{$local_file}) {
# le fichier diffère sur $serveur
push @{$fichiers_differents{$local_file}}, $serveur;
}
}
}

# recherche des fichiers en surplus
my %fichiers_ensurplus;
foreach my $file (keys %Datas) {
if (not defined $SrcDatas{$file}) {
# le fichier n'existe pas en local
$fichiers_ensurplus{$file} = [keys %{$Datas{$file}}];
}
}

Les clés de %fichiers_manquants donnent la liste des fichiers locaux qui
manquent sur au moins un serveur (et on associe à chaque nom de fichier
la liste des serveurs sur lesquels il n'existe pas).

Le tableau associatif %fichiers_differents est bâti sur le même principe
mais pour les fichiers qui diffèrent par leur MD5.

Les clés de %fichiers_ensurplus donnent la liste des fichiers qui
existent sur au moins un serveur sans exister en local (et on associe à
chaque nom de fichier la liste des serveurs sur lesquels il est en
surplus).

Mais il faudrait adapter les structures de données qui collectent les
réponses à la manière dont tu comptes exploiter ces réponses...
 #3  
15/05/2010, 12h10
kurtz le pirate
In article <wt98w7lmv59.fsf>,
Paul Gaborit <Paul.Gaborit> wrote:

> ...
>Il est souvent intéressant de faire ce genre de tests lorsqu'on collecte
>les données plutôt qu'à posteriori comme ça les boucles sont déjà
>réalisées implicitement... Mais supposons que ce n'est pas faisable.


si bien sûr que c'est faisable. je n'y avais pas pensé. c'est plutot
je collecte tout puis j'analyse...


> La méthode à choisir dépend beaucoup du résultat attendu. On ne
> procédera pas de la même manière selon qu'on attend une réponse du
> type :
>
> 1- oui(tout est pareil)/non(il y a des différences).
> 2- tel serveur est différent des données locales.
> 3- pour chaque serveur, la liste des fichiers en trop, la liste des
> fichiers manquants, la liste des fichiers dont le MD5 différe.
> ...


oui, c'est bien le point 3 auquel je voudrais arriver.


je vais lire calmement ta réponse et voir comme adapter tout cela à
mes besoins.



en tout cas, merci beaucoup.
Discussions similaires
Mettre un hash dynamique dans un hash ?

Bonjour, J'aurais une petite question concernant les hash et comment inclure dynamiquement un hash dans un hash. Je souhaite faire un hash : my %zero = ('x' => 0, 'y' =>...

sorte de hash de hash comment faire ?

j'aurais besoin d'une structue de "hash de hash" comment faire ??? la structure que je souhaite enregistre est du type : Hardware: Hardware Overview: Machine Name: iMac...

Hash de hashs : existence d'une clé dans une hash fille

Bonjour, J'ai une hash de hashs, disons ça (je l'ai copié sur un site): my %file_attachments = ( 'test1.zip' => { '123'=>'yes','price' => '10.00', 'desc' => 'the 1st...

Initialiser un hash de hash de hash de hash au fur et à mesure

Bonjour, Je désire obtenir le hash suivant mon_hash | |-----> LUC-----> avant ----->joueur_1 -----> pts =12 | | | |


Fuseau horaire GMT. Il est actuellement 10h50. | Privacy Policy