Bonjour,
j'ecris actuellement un script qui liste le contenu d'un repertoire donné, il enregistre ces données dans un fichier texte et vient comparer le contenu de ce fichier texte ( jour J) avec le contenu du meme fichier texte du jour precedent (jour J-1)
Pour la comparaison je passe par une fonction. En fait, je recupere les données de chaque fichiers ( J et J-1) dans 2 hashs puis je les passe a la fonction par reference.
une fois dans ma fonction, je teste la taille des 2 hashs (et j'aimerai aussi tester le contenu mais il y a encore du boulot), et suivant la difference de taille entre les deux, je dit si des elements ont ete ajoutés, supprimé ou si rien n'a changé. Ensuite j'indique les valeurs ajoutées ou supprimées. Je renvoi ces valeurs dans un tableau pour les ajouter a mon fichier texte (jour J) et les envoyer par mail.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #comparaison des 2 fichiers print "je rentre ds la fonction comparaison\n"; my @tableau = &comparaison(\%datas, \%datas1);
Le soucis c'est que je m'embrouille un peu dans l'ecriture de ma fonction et que j'ai ecrit un premier jet qui ne fonctionne pas completement et je ne trouve pas l'erreur. de plus peu etre aurez vous d'autres solutions a me proposer (plus optimisées, etc). J'aimerais si possible ne pas passer par une fonction existante de perl qui effectuerai le meme travail.
la dite fonction
une autre solution que l'on ma proposée, consisté a comparer mes deux fichiers (via 2tableaux) lignes par lignes mais j'aimerai mieux opter pour l'option des hash et des references avec lesquel je lutte un peu il est vrai.
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 sub comparaison { my ($datas,$datas1)= @_; #recuperation des references ds la fonction que des scalaires ici. my $i=0; my $diff = 0; print "datas contient :\n"; #foreach (sort keys %{$datas}) #trié foreach (keys %{$datas}) { print "$_ -> $datas->{$_}\n"; } print "datas1 contient :\n"; foreach (keys %{$datas1}) { print "$_ -> $datas1->{$_}\n"; } print "je suis ds fonction comparaison\n"; print "Comparaisons des tailles :\n"; my $size_datas = scalar(keys %{$datas}); #renvoi le nbre d'entree ds datas my $size_datas1 = scalar(keys %{$datas1}); #renvoi le nbre d'entree ds datas1 print ($size_datas,"\n"); print ($size_datas1,"\n"); print "comparaison des 2 fichiers\n"; if($size_datas != $size_datas1) { my $diff = ($size_datas-$size_datas1); if ($diff>0) { print"Il y a $diff entree(s) a rajouter.\n"; for ($i=$size_datas1; $i<$size_datas1+$diff; $i++) { print "Nouvel élément : $datas{$i}\n"; #LINE 144 } } if ($diff==0) {print"Il n'y rien de nouveau.\n";} if ($diff<0) { print"Il y a $diff entrée(s) enlevé rajouter.\n"; for ($i=$size_datas1; $i<$size_datas1+$diff; $i++) { print "Elément supprimé : $datas{$i}\n"; #LINE 156 } } } }
D'avance merci pr votre aide.
J'avais poublié de preciser le message d'erreur
Global symbol "%datas" requires explicit package name at C:\Vincent\Scripts\Perl\test\liste_rep.pl. line144
Global symbol "%datas" requires explicit package name at C:\Vincent\Scripts\Perl\test\liste_rep.pl. line156
Partager