Bonjour,

Je débute en Perl (en en programmation de manière générale), j'ai fais un script qui permet de comparer deux répertoires (il fonctionne). Ce que j'aimerais c'est savoir si il y a des choses dans mon code qu'on n'a pas le droit de faire, ou mal faite qu'on peut améliorer facilement.

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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
use Getopt::Long;
use Digest::MD5;
 
#Variable nécessaire pour l'utilisation des options
my $size = '';
my $date = '';
my $md5 = '';
 
#Table contenant les tests déjà effectués lors de la première comparaison
@table = ();
 
GetOptions (
    "size" => \$size, 
    "date" => \$date,
    "md5" => \$md5
); 
 
#Le nom des répertoire à comparer passe en argument
my $dir="$ARGV[0]";
my $dir1="$ARGV[1]";
 
#On s'assure que le nom du répertoire ne se termine pas par un "/"
$dir=~ s/[\/]$//;
$dir1=~ s/[\/]$//;
 
#On attribue le nom de fichier de sortie pour le test du script
my $test="rapport";
 
#On ouvre le fichier de sortie en mode écriture
if (!open (FILEOUT,">$test")) { die "Impossible d'ouvrir le fichier $output1"};
 
#on lance les parcours récursifs pour comparer les deux fichiers
&parcourir_arbo_directory($dir,$dir1);        #recurse!
&parcourir_arbo_directory($dir1,$dir);        #recurse!
 
#On ferme le Fileout
close(FILEOUT);
 
exit;
 
#Procédure 
 
sub parcourir_arbo_directory {
 
    #On récupère les deux arguments.
    my $path = shift(@_);
    my $path2 = shift(@_);
 
    #Ouverture des répertoires
    opendir(DIR, $path) or die "can't open $path: $!\n";
    opendir(DIR2, $path2) or die "can't open $path2: $!\n";
 
    #On "récupère" le contenu des répertoires dans des tableaux
    my @files = readdir(DIR);
    my @files2 = readdir(DIR2);
 
    #Pour chacun des « éléments » contenus dans le répertoire,
    #on va vérifier son statut (répertoire -d ou fichier -f)
    #et le comparer au deuxieme répertoire
 
    foreach my $file (@files) {
 
        next if $file =~ /^\.\.?$/;
 
        my $boolean = 0;
        my $diff_md5= 0;
        my $diff_taille= 0;
        my $diff_date= 0;        
 
        #On écrit le chemin complet de l’ « élément »
        my $new_file = $path."/".$file;
 
        #Si l’ « élément » est un répertoire (-d = directory) : on relance le parcours dans le cas où le répertoire existe des deux côtés
 
        if (-d $new_file) {
 
            foreach my $file2 (@files2) {
 
                next if $file2 =~ /^\.\.?$/;
                my $new_file2 = $path2."/".$file2;
 
                if ($file eq $file2 && -d $new_file2) {
 
                    &parcourir_arbo_directory($new_file, $new_file2);        #recurse!
                    $boolean = 1;
 
                }
            }
        }
 
        #Si l’ « élément » est un fichier (-f = file)  : on compare avec les éléments du deuxième répertoire
 
        if (-f $new_file) {
 
            foreach my $file2 (@files2) {
 
                last if($boolean ==1);
                next if $file2 =~ /^\.\.?$/;
 
                #On écrit le chemin complet de l’ « élément »
                $new_file2 = $path2."/".$file2;
                next if (-d $new_file2);
 
                #Comparaison simple, on vérifie juste le nom des fichiers
                if ($file eq $file2 && -f $new_file2) {
                    $boolean = 1;
                }
 
                #Comparaison avec option sur la taille, on vérifie que la taille est identique si ce n'est pas le cas le boolean repasse à 0
                if ($size && -s $new_file ne -s $new_file2 && $boolean == 1) {
                    $boolean = 0;
                    $diff_taille = 1;
                    foreach my $i (@liste) {
 
                            if ($i eq $new_file) {
                                $boolean = 1;
                            }
 
                        }
 
                        push (@liste, $new_file2);                       
                }
 
 
                #Même chose avec la date
                if ($date && -M $new_file ne -M $new_file2 && $boolean == 1) {
                    $boolean = 0;
                    $diff_date = 1;
                    foreach my $i (@liste) {
 
                            if ($i eq $new_file) {
                                $boolean = 1;
                            }
 
                        }
 
                        push (@liste, $new_file2);                            
                }
 
 
                if ($md5 && $boolean == 1) {
 
                    open(FILE1, $new_file) or die "can't open $path: $!\n";
                    open(FILE2, $new_file2) or die "can't open $path: $!\n";
 
                    binmode(FILE1);
                    binmode(FILE2);
 
                    my $md5_check1 = Digest::MD5->new;
                    my $md5_check2 = Digest::MD5->new;
 
                    $md5_check1->addfile(*FILE1);
                    $md5_check2->addfile(*FILE2);
 
                    my $digest1 = $md5_check1->b64digest;
                    my $digest2 = $md5_check2->b64digest;
 
                    close(FILE1);
                    close(FILE2);
 
 
                    if ($digest1 ne $digest2) {
 
                        $boolean = 0;
                        $diff_md5= 1;
 
                        foreach my $i (@liste) {
 
                            if ($i eq $new_file) {
                                $boolean = 1;
                            }
 
                        }
 
                        push (@liste, $new_file2);
                    }
                }
            }  
        }
 
        if ($boolean == 0 && $diff_md5 == 0 && $diff_taille == 0 && $diff_date ==0) {
 
            print FILEOUT "$new_file fichier non existant dans $path2 \n";
 
        }
 
       if ($boolean == 0 && $diff_md5 == 1) {
 
            print FILEOUT "$new_file et $path2/$file ont un MD5 différent \n";
 
        }
 
       if ($boolean == 0 && $diff_taille == 1) {
 
            print FILEOUT "$new_file et $path2/$file ne font pas la même taille \n";
 
        } 
 
       if ($boolean == 0 && $diff_date == 1) {
 
            print FILEOUT "$new_file et $path2/$file n'ont pas la même date \n";
 
        }                             
    }
 
    closedir(DIR);
    closedir(DIR1);       
}

Par exemple j'utilise le hash MD5 pour vérifier que deux fichiers sont identiques, je me suis basé sur un exemple et je ne suis absolument pas sur que ça soit bien fait.
De la même façon, peut être que j'ai fais des erreurs qui pourraient entrainer un conflit mémoire ou quelque chose comme ça j'ai eu d'énorme difficulté par exemple en C avec les pointeurs tout ça, même si là la notion n'existe pas il y a surement des choses qu'on a pas le droit de faire.
Et enfin peut être des variables inutiles ou des simplifications du code facile pour le rendre "beau".

Merci d'avance pour votre attention.

Cordialement,
Djaibi.