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 :

REGEX --> Valeur de retour de m//


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut REGEX --> Valeur de retour de m//
    Bonjour à tous,

    J'ai fait des REGEX Perl, il y a 3 ans maintenant et je rencontre certaines difficultés...

    Les caractères de ma chaines ressemble à ceci :

    15-17 soit en pseudo REGEX : chiffre*-chiffre*

    Le but est donc d'affecter a une variable ce qu'il y a avant le "-" et dans la deuxième la suite.


    J'ai donc un script qui ressemble à ceci, j'ai mis en gras la REGEX en question :

    ...
    while ( my $sheet = $xls->sheet() )
    {
    while ( my $row = $sheet->row )
    {
    ###liste @data contenant toute les infos
    my @data = @$row;
    ###
    #print "@data[0]\n";
    #my $photos = @data[1];
    #print "les photos a traiter sont : $photos\n";


    ###gestion des numéros de photos
    my $photos = @$row[1];
    print "la liste \@photos est egale a : $photos \n";
    $extension = @$row[6];
    #print "$extension \n" ;
    ($photos_start) = ( $photos=~m/[0-9]*/ );
    print "test regexp : $photos_start \n";
    $photos_end = ( $photos=~m/-[0-9]*/ );
    print "test regexp : $photos_end \n";
    }

    }

    Le problème est que le retour de mon print est-celui :

    la liste @photos est egale a : 44-49
    test regexp : 1
    test regexp : 1


    Il m'affiche un "1" comme ci je l'utilsiais comme un retour booléen dans une condition "if".

    Je suis preneur de toute aide =)

    Merci à vous !


    PS : Je m'aide de ce tutoriel :

    http://lhullier.developpez.com/tutor...intro/#LVIII-L

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    Il faut spécifier un 'ensemble' (voir la doc perl sur les regex) en encadrant par des parenthèses les motifs recherchés et apparemment, les variables qui recevront les motifs trouvés (dû au contexte ?? aucune idée)

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $data = "14-16";
     
    my ($photos_start) = ( $data=~m/([0-9]*)/ );
    print "test regexp : $photos_start \n";
     
    my ($photos_end) = ( $data=~m/-([0-9]*)/ );
    print "test regexp : $photos_end \n";
    Perso, je serais passé par un tableau issu d'un split :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $data = "14-16";
     
    my @tab_datas = split( "-", $data);
     
    print "photos_start : $tab_datas[0]\n";
    print "photos_end : $tab_datas[1]\n";

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Résultats
    Citation Envoyé par JeanMi3000 Voir le message
    Il faut spécifier un 'ensemble' (voir la doc perl sur les regex) en encadrant par des parenthèses les motifs recherchés et apparemment, les variables qui recevront les motifs trouvés (dû au contexte ?? aucune idée)

    Je suis preneur de la doc dont tu parles car il y en a tellement !


    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $data = "14-16";
     
    my ($photos_start) = ( $data=~m/([0-9]*)/ );
    print "test regexp : $photos_start \n";
     
    my ($photos_end) = ( $data=~m/-([0-9]*)/ );
    print "test regexp : $photos_end \n";

    Super cela fonctionne correctement, c'était donc les parenthèses qui me manquaient.


    Perso, je serais passé par un tableau issu d'un split :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $data = "14-16";
     
    my @tab_datas = split( "-", $data);
     
    print "photos_start : $tab_datas[0]\n";
    print "photos_end : $tab_datas[1]\n";

    Alors en effet pourquoi pas, mais le problème est que ma liste de photos est déja une liste sortie d'un excel, que je dois ensuite redimensionné, j'ai un peu peur de trop me compliquer avec trop de tableaux.

    Si les performances ne sont pas attendus je demanderais de l'aide pour l'optimisation =)

    Merci de votre réactivité en tout cas !

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    pour du code simple, je me base sur la doc :: http://lhullier.developpez.com/tutor...l/intro/#LVIII

  5. #5
    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
    L'opérateur de "correspondance de motif" se comporte différemment selon le contexte dans lequel il est appelé :
    - s'il est appelé dans un contexte scalaire (par exemple, en affectant le résultat à une variable scalaire commençant donc par un $), alors il retourne un booléen indiquant si le motif est trouvé (1).
    - s'il est appelé dans un contexte de liste (par exemple, en affectant le résultat à une variable tableau commençant donc par @, ou en l'affectant à une liste de variables scalaires, donc des variables entourées de parenthèses), alors il va retourner le ou les sous-chaines correspondants au motif si l'option /g est utilisée, ou le ou les sous-chaines capturées si le motif contient des sous-motif de captures, placés entre parenthèses. Si l'option /g n'est pas utilisée, ou si aucune capture n'est définie dans le motif, il se comportera comme dans le contexte scalaire.

    Remarques liées à ta problématique :
    - si la chaine à découper ne comporte que "chiffre*-chiffre*, tu peux capturer les deux nombres en une seul expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($photo_start, $photo_end) = $data =~ /(\d+?)-(\d+?)/;
    - avec la même condition, je dirais comme JeanMi que l'utilisation de split est plus approppriée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($photo_start, $photo_end) = split /-/, $data;
    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

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Résultats
    @Merci JeanMi3000, c'est aussi celle que j'ai suivi =), désormais tout prend son sens ($1,$2 etc...)

    @Philou67430, j'utliserais surement les concaténations des regexp, mais je suis un peu rouillé =(

    Je risque d'avoir un format de ce genre aussi "chiffre-chiffre,chiffre", donc je pense décomposé cette exception dans une condition "if".


    Merci de votre aide en tout cas.

  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
    Dans le même esprit, tu peux décomposer "chiffre-chiffre,chiffre" avec split :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($start, $end, $step) = split /[-,]/, $data;
    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
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Dans le même esprit, tu peux décomposer "chiffre-chiffre,chiffre" avec split :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($start, $end, $step) = split /[-,]/, $data;
    Ha oui pas mal aussi cela va alléger mon code, il faut juste que ja valide les différentes possibilités.

    Merci

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

Discussions similaires

  1. Valeur de retour d'une procédure stockée
    Par Rudyweb dans le forum MFC
    Réponses: 4
    Dernier message: 25/02/2005, 17h52
  2. fonction operator, valeur de retour
    Par butch dans le forum C++
    Réponses: 21
    Dernier message: 20/09/2004, 10h30
  3. [VB6] Valeur de retour pour une Form
    Par preverse dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/08/2004, 17h16
  4. Valeur de retour d'une procédure externe
    Par elekis dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 16/04/2004, 16h45
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58

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