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

Programmation et administration système Perl Discussion :

Problème expression régulière


Sujet :

Programmation et administration système Perl

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème expression régulière
    Bonjour à tous,

    J'ai un problème avec un script dans le cadre de mon projet d'école. Il y a une étape de mon script qui ne fonctionne pas. Cette étape est le déplacement de tout les fichiers ayant comme nom "032* (suivi de 0 ou plusieurs caractères).ASCCH" du répertoire courant vers un autre répertoire.

    Voici le bout de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $DirLocalIn = "/tmp/test/1" ;
    my $rep = "/tmp/test" ;
    opendir(FILES, $DirLocalIn) || die("Cannot open directory $DirLocalIn\n");
                            my @filestomove= readdir(FILES);
                            foreach my $old_file (@filestomove) {
                                    if ($old_file =~ /032*.ASCCH|032*.ascch/) {
                                            my $old = "/tmp/test/edi/$old_file";
                                            move $old,$rep || die("Move Failed\n");
                                    }
                            }
    Il semblerait que l'expression régulière utilisé pour la variable $old_file ne soit pas correct...Mais je ne trouve pas la bonne formule.

    Je vous remercie en avance de votre aide

    WolfStark

  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
    Les expressions régulières du langage sont un peu plus complètes et complexes que les "wildcard" caractères des listes de fichier d'un shell.
    Entre autre, si tu veux indiquer "n'importe quel caractère" tu dois explicitement écrire "." (ce caractère est donc "interprété" et pour trouver un caractère point dans une chaine, il faut alors l'échapper "\.").
    L'expression régulière pour valider tes noms de fichier serait donc plutôt :
    /032.*\.ASCCH|032.*\.ascch/

    De même, pour faire une recherche non sensible à la casse, tu peux ajouter l'option /i :

    /032.*\.ascch/i
    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
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Rien à redire aux solutions proposées par Philou, mais j'ajoute pour ta compréhension, wolfstark, que le caractère "*", dans une regex, signifie 0, 1 ou plusieurs exemplaires du caractère qui le précède. Donc, et comme "." signifie un caractère quelconque (à l'exception d'un saut à la ligne dans certains cas particuliers), ".*" signifie 0, 1 ou plusieurs caractères quelconques.

  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
    Citation Envoyé par Lolo78 Voir le message
    comme "." signifie un caractère quelconque (à l'exception d'un saut à la ligne dans certains cas particuliers)
    J'espère être bien réveillé aujourd'hui et ne pas encore te reprendre par erreur, mais j'aurais plutôt dit :
    comme "." signifie un caractère quelconque hormis le saut à la ligne (sauf en cas d'usage de l'option /s où le saut à la ligne est inclus)
    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
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Oui, Philou, tu as raison et c'est plus précis comme tu l'écris, j'avais juste voulu signaler en passant que le saut de ligne est un cas un peu à part par rapport au ".", sans vouloir préciser les détails.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    On pourrait aussi utiliser glob, ce qui donnerait quelque du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $DirLocalIn = "/tmp/test/1" ;
    my $rep = "/tmp/test" ;
    my @filestomove=map { s%.*/%% ;$_ } glob "${DirLocalIn}/032*.ASCCH ${DirLocalIn}/032*.ascch"; 
    foreach my $old_file (@filestomove) {
        my $old = "/tmp/test/edi/$old_file";
        move $old,$rep || die("Move Failed\n");
    }
    Bon, là c'est spécifique au bout de code, donc c'est juste dans le cas ou le parcours du répertoire ne sert qu'à faire le move.
    Cordialement.

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Attention avec le glob en perl qui est capable de sortir des noms de fichiers qui n'existent pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -E'say join "\n", glob "./{choucroute_,tête_dé}garnie"'
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Mouais, c'est vrai que glob peut faire des choses un peu bizarres si on l'utilise de façon bizarre. Mais utilisée normalement avec un masque de fichier correspondant à celui du système d'exploitation, cette fonction est tout-à-fait fiable, super utile et bien plus pratique à bien des égards que le couple opendir/readdir, au point que je n'utilise pratiquement jamais ce dernier et presque toujours glob.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Pour le cas de glob qui est soulevé, c'est indiqué dans la documentation de celle-ci.
    Maintenant, on peut dire aussi de faire attention à sa regex: ici on est typiquement dans une regex non sure puisque non bornée.
    Des fichiers tels que 'titi0320001.ASCCHtoto' seront aussi pris en compte.
    Cordialement.

  10. #10
    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 A propos de glob
    Sous Windows, il vaut mieux utiliser File::Glob::bsd_glob que le glob du Core, notamment pour une meilleur gestion des espaces dans les noms de fichier
    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

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je ne cherche pas à départager Superman de Goldorak mais plutôt à noter le coté piégeux, comme disent les québecois, de Core::Glob en Perl, là où on s'attend à trouver un comportement plus intuitif comme le renvoi d'une liste vide.

    L'exemple que j'ai donné peut sembler tiré par les cheveux (bien que), mais on peut très bien observer le phénomène avec un exemple plus simple (ici sans d'accolades): glob "existepas index.*" ou glob "existepas".

    Dés lors qu'un élément se trouve sans wildcard *, ? ou [Ab36], il fait partie de la liste de manière inconditionnelle. La documentation explique ce comportement de <exp_glob> (soit glob("exp_glob")) comme étant calqué sur le résultat d'un echo exp_glob | tr -s ' \r\t\f' '\\012\\012\\012\\012' (puis chaque ligne est chompée). C'est loin d'être évident et c'est un sacré chausse-trappe!

    Pour ce qui est de l'utilisation de File::Glob::bsd_glob sous Windows je ne peux pas essayer car je n'ai plus de place pour installer une VM. Par contre bsd_glob permet d'utiliser l'option GLOB_BRACE qui semble éviter le problème des fichiers non-existants.

    Effectivement il manque les ancres à la pattern regex.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Problème expressions régulières
    Par cottcott dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2007, 14h29
  2. Réponses: 3
    Dernier message: 20/04/2007, 14h47
  3. Problème expression régulières
    Par LEK dans le forum C#
    Réponses: 2
    Dernier message: 18/04/2007, 11h40
  4. [RegEx] problème expression régulière
    Par H-bil dans le forum Langage
    Réponses: 4
    Dernier message: 13/02/2007, 15h38
  5. Problème expressions régulières
    Par sozie9372 dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 15h13

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