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 :

Amélioration de script


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Amélioration de script
    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.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Salut,

    je viens de regarder ton code. A ta place pour chaque test (taille, date ...), je les mettrais dans des fonctions check_size, check_date... ça peut te permettre de vérifier unitairement, chacun d'entre eux en les appelant directement. Ca t'évitera également les fonctions de 200 ou 300 lignes. Le dernier intérêt d'une telle pratique est également de vérifier la portée de tes données car tu vas les passer en paramètres à tes fonctions et tu n'agis pas accidentellement dessus.

    Il faut aussi éviter les variables dont le nom n'est pas explicite genre $boolean afin d'améliorer la lisibilité pour les autres.

    Après, je n'ai pas compris pourquoi tu compares le rep1 avec le rep2 et inversement. Si le résultat est bon ou mauvais dans un sens, il le sera dans l'autre.

    Il faut éviter les variables globales car tu peux y toucher accidentellement. Cela peut grandement compliquer le debug en cas d'inattention.

    Je ne sais pas si c'est pertinent mais dans ce genre de cas, je te suggère de tester, le cas des liens. C'est un cas d'erreur qui peut mener à des boucles infinies.

    Bonne continuation.

Discussions similaires

  1. Amélioration de script
    Par Sttetik dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 04/03/2014, 14h14
  2. problème d'amélioration de script dans une galerie
    Par lirisnocif dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 24/03/2009, 15h34
  3. [Galerie] Un peu d'aide pour améliorer un script
    Par ambigua dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 21/02/2008, 22h32
  4. Appel d'offre pour une amélioration de script
    Par Hamzaxxx dans le forum Autres
    Réponses: 0
    Dernier message: 05/12/2007, 14h14
  5. Réponses: 6
    Dernier message: 23/01/2007, 17h20

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