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

Modules Perl Discussion :

File::Find wanted et prepocess


Sujet :

Modules Perl

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut File::Find wanted et prepocess
    Bonjour à tous,

    Jusqu'à présent pour mon script de sauvegarde, j'utilisais ce code afin d'obtenir l'arborescence à sauvegarder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find (sub {push @all_files,$File::Find::name}, ".");
    Le problème étant que je ne prends pas en compte l'exclusion de fichiers.
    J'ai donc poussé les portes du module find (merci à la commande perldoc File::Find ^^).

    J'ai donc commencer ce bout de code :

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    #
    use File::Find;
    #
    # Déclaration des variables
    #
    my $dir_http = "/home/cassis2k/http";
    my @excluded_dir = ("rep1", "rep2", "rep3");
    #
    # Déclaration des fonctions
    #
    sub AllFiles
    {
            #
            # Fontion pour le WANTED
            #
            my @all_files;
            push (@all_files, $File::Find::name);
            return @all_files;
    }
    #
    sub Filter
    {
            #
            # Fonction pour le PREPORCESS pour me module File::find
            #
    }
    ###### Début du script #####
    #
    my @all_files = find({preprocess => \&Filter, wanted => \&AllFiles}, $dir_http);
    print "@all_files\n";
     
    my $nb_of_files = scalar(@all_files);
    print "$nb_of_files\n";
     
    #
    ###### Fin du script #####
    Ma première question se pose suite au résultat :

    Mon code me semble correcte pourtant la liste semble vide

    Ma seconde question concerne une info que j'ai lu je ne sais plus trop où. Lorsqu'on utilise File::Find avec use warning, il peut y avoir des effets indésirables. Pour parer ces effets, il suffit de rajout un no warning File::Find. Que pensez vous de l'utilisation de no warning ? Est elle à proscrire ?

    Merci d'avance aux personnes qui s'arrêteront pour m'aider

  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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Il est normal que ton code ne remplisse pas le tableau :
    - la fonction preprocess doit retourner une liste de chaine à partir d'une liste de chaine fournie en paramètre. Si tu veux qu'elle ne filtre rien dans un premier temps, il faudrait alors l'écrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub Filter
    {
            #
            # Fonction pour le PREPORCESS pour me module File::find
            #
      return @_;
    }
    - la fonction wanted doit remplir ton tableau. Il est inutile qu'elle retourne quoi que ce soit.
    - pour finir, find ne retourne pas la liste des fichiers sélectionnés (elle se trouve dans le tableau rempli par wanted). Il ne faut donc pas affecter le retour de find à @all_files.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Merci Philou67430.

    Pour la fonction Allfiles (argument de WANTED), je ne comprends pas comment je peux récupérer ma liste @all_files en dehors de la fonction sans utiliser de return.

    Pour l'instant je retire l'argument PREPOCESS afin de procéder étape par étape.

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    #
    use File::Find;
    #
    # Déclaration des variables
    #
    my $dir_http = "/home/cassis2k/http";
    my @excluded_dir = ("rep1", "rep2", "rep3");
    #
    # Déclaration des fonctions
    #
    sub AllFiles
    {
            #
            # Fontion pour WANTED, module File::find
            #
            my @all_files;
            push (@all_files, $File::Find::name);
    }
    #
    sub Filter
    {
            #
            # Fonction pour PREPORCESS, module File::find
            #
            return @_;
    }
    ###### Début du script #####
    #
    my @all_files = ();
    find({wanted => \&AllFiles}, $dir_http);
    print "@all_files\n";
     
    my $nb_of_files = scalar(@all_files);
    print "$nb_of_files\n";
     
    #
    ###### Fin du script #####
    @all_files semble être un tableau vide

  4. #4
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Tu définis @all_files localement dans AllFiles(), donc il ne sera pas visible à la sortie de la fonction. Supprime cette déclaration my dans Allfiles, et ton tableau déclaré avant l'appel à find sera utilisé, et ton tableau ne sera plus vide.

    PS : pour inclure du code, utilise la balise CODE et non QUOTE (icône ).

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    ...
    PS : pour inclure du code, utilise la balise CODE et non QUOTE (icône ).
    C'est corrigé. Je teste tout de suite

  6. #6
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Tu définis @all_files localement dans AllFiles(), donc il ne sera pas visible à la sortie de la fonction. Supprime cette déclaration my dans Allfiles, et ton tableau déclaré avant l'appel à find sera utilisé, et ton tableau ne sera plus vide.

    ...
    Le fait d'utiliser use strict; m'empêche de déclarer mes variables sans my..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Global symbol "@all_files" requires explicit package name at ./FilteredFiles.pl line 19.
    C'est pour ça que le return était présent au début.

  7. #7
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Déclare ta variable my @all_files avant ta fonction Allfiles, et elle sera définie avec la bonne portée.
    Sinon, tu peux aussi la définir our.

  8. #8
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Merci ça fonctionne, en la déclarant tout en haut, j'en fait un variable globale en fait ?
    Je passe donc à la fonction Filter().

  9. #9
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Le mot global à de multiples sens, je préfèrerais donc dire qu'il a une portée globale au script, mais qu'il n'est pas exportable.

  10. #10
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Philou67430, merci beaucoup pour ces informations. J'attaque la suite

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

Discussions similaires

  1. File Find et duplication de de nom.
    Par loula427 dans le forum Modules
    Réponses: 10
    Dernier message: 09/12/2010, 22h10
  2. Utilisation du module File::Find
    Par mickael777 dans le forum Modules
    Réponses: 8
    Dernier message: 09/04/2010, 11h30
  3. Problème d'utilisation de File::Find
    Par jotape75 dans le forum Modules
    Réponses: 2
    Dernier message: 05/06/2007, 09h51
  4. [File::Find] Renvoyer un tablo
    Par GLDavid dans le forum Modules
    Réponses: 5
    Dernier message: 17/03/2007, 10h31
  5. Probleme de perf avec File::Find::name;
    Par Ludo167 dans le forum Modules
    Réponses: 6
    Dernier message: 14/07/2004, 11h31

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