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.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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 ).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

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