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 avec un switch


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Regex avec un switch
    Bonjour,
    Je suis une vrai novice en Regex et j'ai vraiment du mal à comprendre la syntaxe.

    Mon problème est simple :
    j'ai une variable contenant une désignation. Je veux que grâce à des Regex faire:

    Si ma désignation contient au moins deux ou plus des mots de ma Regex alors j'initialise ma variable avec un nombre.

    J'ai essayé plusieurs Regex mais perl refusait que j'utilise le \g ce qui pourtant d'après le site http://www.regexr.com/ ma Regex fonctionnait.

    Pourriez-vous m'éclairer sur la façon de construire cette Expression. Merci d'avance.

    Première version de mon expréssion : Mais la j'avais une erreur : " Reference to invalid group 0 in regex perl ...."
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     /(Revue)|(de)|(besoins)|(d'achats)/g
    J'ai ensuite pensé à lui faire la liste des mots :

    Deuxième version :
    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
     
    my $typeJalon;
    switch (@Ligne[3]) {
    	case /Revue|besoins|d'achats/ { $typeJalon = 12; last;}
    	case /Evaluation|fournisseurs/ {$typeJalon = 20; last;}
    	case /Bilan|interne|formation/ {$typeJalon = 3; last;}
    	case /Reunion|lancement|formation /{$typeJalon = 14; last;}
    	case /Developpement|des|supports|formations/ {$typeJalon = 5; last;}
    	case /Conformité|supports-spécifications/ {$typeJalon = 6; last;}
    	case /PV|formation/{$typeJalon = 7; last;}
    	case /Redaction|spécifications|formation/ {$typeJalon = 8; last;}
    	case /Revue|demarrage/ {$typeJalon = 9; last;}
    	case /Plan|qualite/ {$typeJalon = 10; last;}
    	case /Revue|transfert|maintenance-chantier/ {$typeJalon = 11; last;}
    	case /Revue|Projet-SI/ {$typeJalon = 13; last;}
    	case /Reunion|lancement|formation/ {$typeJalon = 14; last;}
    	case /Definition|des|besoins|projet/ {$typeJalon = 15; last;}
    	case /Revue|lancement|Fin|projet/ {$typeJalon = 16; last;}
    	case /Revue|Fin|projet/ {$typeJalon = 17; last;}
    	case /Revue|transfert|chantier-maintenance/ {$typeJalon = 18; last;}
    	case /Revue|passage|garantie-maintenance/ {$typeJalon = 19; last;}
    	case /Revue|specification/ {$typeJalon = 21; last;}
    	case /Revue|conception/ {$typeJalon = 22; last;}
    	case /Revue|choix|technique/ {$typeJalon = 23; last;}
    	case /Revue|livraison|materiel/ {$typeJalon = 24; last;}
    	case /Revue|livraison|logiciel/ {$typeJalon = 25; last;}
    	case /Revue|recette|interne/ {$typeJalon = 26; last;}
    	case /Note|d’organisation|recette/ {$typeJalon = 27; last;}
    	case /Evaluation|deroulement|projet/ {$typeJalon = 20; last;}
    	case /PV|reception|provisoire/ {$typeJalon = 29; last;}
    	case /PV|recette|usine/ {$typeJalon = 30; last;}
    	case /PV|recette|site/ {$typeJalon = 31; last;}
    	case /PV|reception|definitive/ {$typeJalon = 32; last;}
    	case /Rapport|d'activite/ {$typeJalon = 37; last;}
    	case /Bilan|annuel/ {$typeJalon = 38; last;}
    	case /Visite|preventive|site/ {$typeJalon = 39; last;}
    	case /Reunion|annuelle/ {$typeJalon= 40; last;}
    	else { $typeJalon = 0; }
    }
    Mais il ne repère pas correctement les choses ça n'a aucun sens puisqu'il affecte des numéros alors que la désignation traitée ne contient même pas les termes.

    Un big mega gros merci à celui qui m'aidera !!!!!!

  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
    Pour être bien sûr de comprendre, prenons un exemple : tu voudrais que si la désignation contient soit le mot "Revue", soit le mot "besoins", soit le mot "d'achats", alors $typeJalon soit mis à 12 ? (je dis bien "l'un de ces mots là" : c'est à dire que si la désignation est "Revue démarrage", alors $typeJalon vaudra 12 et non 9 comme tu le suggères dans ton bout de code).
    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 à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Hum... tu viens de voir un truc que je pensais pas.

    Je vais peut-être limité mes recherches pour que la désignation contienne obligatoirement que deux mots et il faut que se soit insensible aux majuscules/minuscules...


    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
     
    my $typeJalon;
    switch (@Ligne[3]) {
    	case /Revue|d'achats/ { $typeJalon = 12; last;}
    	case /Evaluation|fournisseurs/ {$typeJalon = 20; last;}
    	case /Bilan|interne|formation/ {$typeJalon = 3; last;}
    	case /lancement|formation /{$typeJalon = 14; last;}
    	case /supports|formations/ {$typeJalon = 5; last;}
    	case /Conformité|supports-spécifications/ {$typeJalon = 6; last;}
    	case /PV|formation/{$typeJalon = 7; last;}
    	case /spécifications|formation/ {$typeJalon = 8; last;}
    	case /Revue|demarrage/ {$typeJalon = 9; last;}
    	case /Plan|qualite/ {$typeJalon = 10; last;}
    	case /transfert|maintenance-chantier/ {$typeJalon = 11; last;}
    	case /Revue|Projet-SI/ {$typeJalon = 13; last;}
    	case /lancement|formation/ {$typeJalon = 14; last;}
    	case /besoins|projet/ {$typeJalon = 15; last;}
    	case /Fin|projet/ {$typeJalon = 16; last;}
    	case /Revue|Fin|projet/ {$typeJalon = 17; last;}
    	case /transfert|chantier-maintenance/ {$typeJalon = 18; last;}
    	case /passage|garantie-maintenance/ {$typeJalon = 19; last;}
    	case /Revue|specification/ {$typeJalon = 21; last;}
    	case /Revue|conception/ {$typeJalon = 22; last;}
    	case /choix|technique/ {$typeJalon = 23; last;}
    	case /livraison|materiel/ {$typeJalon = 24; last;}
    	case /livraison|logiciel/ {$typeJalon = 25; last;}
    	case /recette|interne/ {$typeJalon = 26; last;}
    	case /Note|recette/ {$typeJalon = 27; last;}
    	case /Evaluation|projet/ {$typeJalon = 20; last;}
    	case /reception|provisoire/ {$typeJalon = 29; last;}
    	case /recette|usine/ {$typeJalon = 30; last;}
    	case /recette|site/ {$typeJalon = 31; last;}
    	case /reception|definitive/ {$typeJalon = 32; last;}
    	case /Rapport|d'activite/ {$typeJalon = 37; last;}
    	case /Bilan|annuel/ {$typeJalon = 38; last;}
    	case /Visite|preventive/ {$typeJalon = 39; last;}
    	case /Reunion|annuelle/ {$typeJalon= 40; last;}
    	else { $typeJalon = 0; }
    }
    merci de te pencher sur mon cas ;-)

  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
    Pour l'insensibilité à la casse, ajoute l'option i à la regexp : /Revue|d'achats/i
    Cela dit, ton nouveau code ne règle pas le problème lié à la présence du mot "Revue" dans 2 cas de figures où $typeJalon doit avoir deux valeurs différentes.
    Ta discrimination n'est pas complète, et par ailleurs, ne me semble pas "judicieuse".
    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
    Deux remarques sur des erreurs probables:
    Si tu veux le quatrième élément du tableau @Ligne, il faut écrire:

    Si tu avais mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    au début de ton code (comme tu devrais toujours le faire), le compilateur t'aurait prévenu de cette erreur.


    Ensuite, la logique de ton switch est erronée. Si ta donnée comprends le mot "Revue", c'est le premier case qui s'exécutera, même si la ligne contient "'Revue demarrage". Si bien que toutes les autres expressions régulières contenant le mot "Revue" ne servent à rien dans ton code. Ce n'est sans doute pas ce que tu souhaites (même si je ne suis pas sûr de comprendre ce que tu veux vraiment).

    J'ajoute que le switch est "déprécié" et ne devrait sans doute plus être utilisé.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Je n'ai pas donnée la page entière de mon code et j'utilise bien les packages et j'utilise mes tableaux toujours en mettant l'arrobase et je n'ai jamais eu d'erreur. Mais si ce n'est pas de coutume je vais changer merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    use strict;
    use Win32::ODBC;
    use Net::SMTP;
    use DBI;
    use Win32::OLE qw(in with);
    use Win32::OLE::Const 'Microsoft Excel';
    use Switch;
    Après en ce qui concerne mes Regex je vous demande de l'aide car je ne sais pas en faire
    Ce que je vous demande c'est de m'expliquer juste qu'elle évolution je peux apporter pour que je trouve le couple 'Revue' et 'démarrage' (par exemple) pour affecter la valeur que j'ai défini.

    J'ai une base de données avec un très grand nombre d'enregistrement à basculer dans une nouvelle avec des contraintes plus accru pour éviter les désignations libres.

    Je souhaite donc faire en sorte de trouver dans les anciennes désignations le type de la nouvelle.


    Pour le switch, s'il n’est plus conseillé de l’utiliser aujourd'hui par quoi pensez-vous que je puisse basculer ? Une condition If me semble trop lourde.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Par exemple dans l'ancienne base j'ai
    "Mise à jour des Fiches Evaluation Fournisseurs"

    Avec ma regex je veux que ma variable $typejalon soit égale à 20.

    OU par exemple
    "Evaluation sur le déroulement de projet"
    et là ma variable $typejalon soit égale à 28; (une coquille dans mon switch c'est 28 et non pas 20 : case /Evaluation|projet/i {$typeJalon = 28; last;} )

  8. #8
    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
    Si tu avais mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    au début de ton code (comme tu devrais toujours le faire), le compilateur t'aurait prévenu de cette erreur.
    Légère rectification : ce n'est pas une erreur, c'est une "warning" (cela ne génère pas d'exception, car c'est syntaxiquement et sémantiquement correct).
    D'ailleurs, le fait d'écrire @ligne[(3)] ne génère plus du tout de warning, tout en retournant la même chose que $ligne[3] ou @ligne[3].
    Cela dit, je plussoies au fait qu'il est important d'écrire $ligne[3] au lieu de @ligne[3] car l'expression que l'on cherche à récupérer est un scalaire, pas un tableau (donc sigil $ et pas @).

    Ensuite, la logique de ton switch est erronée. Si ta donnée comprends le mot "Revue", c'est le premier case qui s'exécutera, même si la ligne contient "'Revue demarrage". Si bien que toutes les autres expressions régulières contenant le mot "Revue" ne servent à rien dans ton code. Ce n'est sans doute pas ce que tu souhaites (même si je ne suis pas sûr de comprendre ce que tu veux vraiment).
    C'est ce que je soulignais avant, mais plus encore, je m'interroge sur le fait de "tester la présence de certains mots" pour déterminer un type de donnée.
    Question à leilan : n'est-il pas plus simple de faire une comparaison de désignation complète, éventuellement en la prétraitant pour que la correspondance soit plus souple :
    - pour se jouer des minuscules/majuscule : soit ajouter /i à la regexp, soit appliquer la regexp sur lc($designation)
    - normaliser les espaces et/ou signes de ponctuation en les réduisant ou les supprimant ($designation =~ s/[[:punct:]]*//g)
    - ...
    Citation Envoyé par Lolo78
    J'ajoute que le switch est "déprécié" et ne devrait sans doute plus être utilisé.
    N'est-ce pas plutôt les fonctions given/when qui sont dépréciées en 5.18, à peine introduites en 5.10 ? (et à mon grand regret).

    Citation Envoyé par leilan Voir le message
    Je n'ai pas donnée la page entière de mon code et j'utilise bien les packages
    Non, pas le pragma warnings
    et j'utilise mes tableaux toujours en mettant l'arrobase et je n'ai jamais eu d'erreur.
    C'est parce que c'est une warning
    Mais si ce n'est pas de coutume je vais changer merci.
    Ce n'est pas une coutume, c'est tout simplement qu'en écrivant @ devant un symbole, tu demande un tableau, pas un scalaire. Or, un élément de tableau est TOUJOURS un scalaire. Si ce scalaire est une référence à un tableau, le fait de mettre @ pour le déréférencer ajoute encore de la confusion. Perl transforme "automagiquement" ton @ en $, parce que c'est une erreur courante, mais ça n'en reste pas moins un usage incorrect du sigil @ (@ligne[3] devrait en fait retourner une liste de un élément, ce qui est similaire à un scalaire dans la plupart des utilisations).
    Après en ce qui concerne mes Regex je vous demande de l'aide car je ne sais pas en faire
    Ce que je vous demande c'est de m'expliquer juste qu'elle évolution je peux apporter pour que je trouve le couple 'Revue' et 'démarrage' (par exemple) pour affecter la valeur que j'ai défini.

    J'ai une base de données avec un très grand nombre d'enregistrement à basculer dans une nouvelle avec des contraintes plus accru pour éviter les désignations libres.

    Je souhaite donc faire en sorte de trouver dans les anciennes désignations le type de la nouvelle.
    Le problème ne se situe pas au niveau des regexp individuellement, qui semblent correctes. La recherche d'un "Revue" et "Démarrage" dans une chaine se fait bien avec /Revue|Démarrage/i, mais dans l'algorithme d'affectation de $typeJalon. Et pour te répondre correctement, nous devons connaitre précisément ton besoin (en tout cas moi, j'en ai besoin).
    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

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    si j'ai bien compris, tu cherches à avoir les mots donnés et le caratère '|' et en fait un délimiteur des 2 mots et non pas comme dans une regex (l'un OU l'autre)
    voilà un premier test de résolution:
    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
     
    my $typeJalon;
    if ($Ligne[3] =~ /Revue(.*?)d'achats/ ){ $typeJalon = 12; last;}
    elsif ($Ligne[3] =~ /Evaluation(.*?)fournisseurs/ ){$typeJalon = 20; last;}
    elsif ($Ligne[3] =~ /Bilan(.*?)interne(.*?)formation/ ){$typeJalon = 3; last;}
    elsif ($Ligne[3] =~ /lancement(.*?)formation /){$typeJalon = 14; last;}
    elsif ($Ligne[3] =~ /supports(.*?)formations/ ){$typeJalon = 5; last;}
    elsif ($Ligne[3] =~ /Conformité(.*?)supports-spécifications/ ){$typeJalon = 6; last;}
    elsif ($Ligne[3] =~ /PV(.*?)formation/){$typeJalon = 7; last;}
    elsif ($Ligne[3] =~ /spécifications(.*?)formation/ ){$typeJalon = 8; last;}
    elsif ($Ligne[3] =~ /Revue(.*?)demarrage/ ){$typeJalon = 9; last;}
    elsif ($Ligne[3] =~ /Plan(.*?)qualite/ ){$typeJalon = 10; last;}
    elsif ($Ligne[3] =~ /transfert(.*?)maintenance-chantier/ ){$typeJalon = 11; last;}
    elsif ($Ligne[3] =~ /Revue(.*?)Projet-SI/ ){$typeJalon = 13; last;}
    elsif ($Ligne[3] =~ /lancement(.*?)formation/ ){$typeJalon = 14; last;}
    elsif ($Ligne[3] =~ /besoins(.*?)projet/ ){$typeJalon = 15; last;}
    elsif ($Ligne[3] =~ /Fin(.*?)projet/ ){$typeJalon = 16; last;}
    elsif ($Ligne[3] =~ /Revue(.*?)Fin(.*?)projet/ ){$typeJalon = 17; last;}
    elsif ($Ligne[3] =~ /transfert(.*?)chantier-maintenance/ ){$typeJalon = 18; last;}
    elsif ($Ligne[3] =~ /passage(.*?)garantie-maintenance/ ){$typeJalon = 19; last;}
    elsif ($Ligne[3] =~ /Revue(.*?)specification/ ){$typeJalon = 21; last;}
    elsif ($Ligne[3] =~ /Revue(.*?)conception/ ){$typeJalon = 22; last;}
    elsif ($Ligne[3] =~ /choix(.*?)technique/ ){$typeJalon = 23; last;}
    elsif ($Ligne[3] =~ /livraison(.*?)materiel/ ){$typeJalon = 24; last;}
    elsif ($Ligne[3] =~ /livraison(.*?)logiciel/ ){$typeJalon = 25; last;}
    elsif ($Ligne[3] =~ /recette(.*?)interne/ ){$typeJalon = 26; last;}
    elsif ($Ligne[3] =~ /Note(.*?)recette/ ){$typeJalon = 27; last;}
    elsif ($Ligne[3] =~ /Evaluation(.*?)projet/ ){$typeJalon = 20; last;}
    elsif ($Ligne[3] =~ /reception(.*?)provisoire/ ){$typeJalon = 29; last;}
    elsif ($Ligne[3] =~ /recette(.*?)usine/ ){$typeJalon = 30; last;}
    elsif ($Ligne[3] =~ /recette(.*?)site/ ){$typeJalon = 31; last;}
    elsif ($Ligne[3] =~ /reception(.*?)definitive/ ){$typeJalon = 32; last;}
    elsif ($Ligne[3] =~ /Rapport(.*?)d'activite/ ){$typeJalon = 37; last;}
    elsif ($Ligne[3] =~ /Bilan(.*?)annuel/ ){$typeJalon = 38; last;}
    elsif ($Ligne[3] =~ /Visite(.*?)preventive/ ){$typeJalon = 39; last;}
    elsif ($Ligne[3] =~ /Reunion(.*?)annuelle/ ){$typeJalon= 40; last;}
    else{ $typeJalon = 0; }
    j'ai pris le parti que tes différents mots ne sont pas forcément l'un à la suite de l'autre

    PS: si c'est bien ce que tu cherches, j'essayerai de faire quelque chose de plus propre

  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
    Citation Envoyé par 6ril23 Voir le message
    si j'ai bien compris, tu cherches à avoir les mots donnés et le caratère '|' et en fait un délimiteur des 2 mots et non pas comme dans une regex (l'un OU l'autre)
    Ce n'est pas ce que je comprends quand je lis ceci :
    Citation Envoyé par leilan Voir le message
    Si ma désignation contient au moins deux ou plus des mots de ma Regex alors j'initialise ma variable avec un nombre.
    Cela dit, en rélisant l'énoncé, je m'aperçois d'une subtilité à laquelle je n'avais pas fait attention (et que j'ai mise en gras ci-dessus).
    Ainsi, la comparaison avec la regexp devrait se faire en vérifiant le nombre de mot matchés, et donc, le test d'un cas, se faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((() = $ligne[3] =~ /\b(revue|d'achat)\b/g) >= 2) {
    }
    \b permet d'identifier une frontière de mot (ce qui permet de ne pas matcher entrevue avec /revue/) et l'affectation à () permet de fournir un contexte de liste à //g ce qui, une fois évalué en scalaire pour l'opérateur >= transforme la liste des mots en nombre de mot.
    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
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci à tous et j'ai beaucoup appris grâce à toi Philou67430.

    Alors la solution de 6ril23 est pas bonne mais je l'ai modifié et j'ai trouvé à peut près ça:
    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
     
    my $typeJalon;
    if ($Ligne[3] =~ m/.*Revue.*d'achats.*/) {	$typeJalon = 12;
    }elsif ($Ligne[3] =~ m/.*Evaluation.*fournisseurs.*/){$typeJalon = 20;
    }elsif ($Ligne[3] =~ m/.*Bilan.*interne.*formation.*/) {$typeJalon = 3;
    }elsif ($Ligne[3] =~ m/.*lancement.*formation /){$typeJalon = 14; 
    }elsif ($Ligne[3] =~ m/.*supports.*formations.*/) {$typeJalon = 5;
    }elsif ($Ligne[3] =~ m/.*Conformité.*supports-spécifications.*/) {$typeJalon = 6;
    }elsif ($Ligne[3] =~ m/.*PV.*formation/){$typeJalon = 7;
    }elsif ($Ligne[3] =~ m/.*spécifications.*formation.*/) {$typeJalon = 8;
    }elsif ($Ligne[3] =~ m/.*Revue.*demarrage.*/) {$typeJalon = 9;
    }elsif ($Ligne[3] =~ m/.*Plan.*qualite.*/) {$typeJalon = 10;
    }elsif ($Ligne[3] =~ m/.*transfert.*maintenance-chantier.*/) {$typeJalon = 11;
    }elsif ($Ligne[3] =~ m/.*Revue.*Projet-SI.*/) {$typeJalon = 13;
    }elsif ($Ligne[3] =~ m/.*lancement.*formation.*/) {$typeJalon = 14;
    }elsif ($Ligne[3] =~ m/.*besoins.*projet.*/) {$typeJalon = 15; 
    }elsif ($Ligne[3] =~ m/.*lancement.*Fin.*projet.*/) {$typeJalon = 16;
    }elsif ($Ligne[3] =~ m/.*Revue.*Fin.*projet.*/) {$typeJalon = 17;
    }elsif ($Ligne[3] =~ m/.*transfert.*chantier-maintenance.*/) {$typeJalon = 18;
    }elsif ($Ligne[3] =~ m/.*passage.*garantie-maintenance.*/) {$typeJalon = 19;
    }elsif ($Ligne[3] =~ m/.*Revue.*specification.*/) {$typeJalon = 21;
    }elsif ($Ligne[3] =~ m/.*Revue.*conception.*/) {$typeJalon = 22;
    }elsif ($Ligne[3] =~ m/.*choix.*technique.*/) {$typeJalon = 23;
    }elsif ($Ligne[3] =~ m/.*livraison.*materiel.*/) {$typeJalon = 24;
    }elsif ($Ligne[3] =~ m/.*livraison.*logiciel.*/) {$typeJalon = 25;
    }elsif ($Ligne[3] =~ m/.*recette.*interne.*/) {$typeJalon = 26;
    }elsif ($Ligne[3] =~ m/.*Note.*recette.*/) {$typeJalon = 27;
    }elsif ($Ligne[3] =~ m/.*Evaluation.*projet.*/) {$typeJalon = 20;
    }elsif ($Ligne[3] =~ m/.*reception.*provisoire.*/) {$typeJalon = 29;
    }elsif ($Ligne[3] =~ m/.*recette.*usine.*/) {$typeJalon = 30;
    }elsif ($Ligne[3] =~ m/.*recette.*site.*/) {$typeJalon = 31;
    }elsif ($Ligne[3] =~ m/.*reception.*definitive.*/) {$typeJalon = 32;
    }elsif ($Ligne[3] =~ m/.*Rapport.*d'activite.*/) {$typeJalon = 37;
    }elsif ($Ligne[3] =~ m/.*Bilan.*annuel.*/) {$typeJalon = 38;
    }elsif ($Ligne[3] =~ m/.*Visite.*preventive.*/) {$typeJalon = 39;
    }elsif ($Ligne[3] =~ m/.*Reunion.*annuelle.*/) {$typeJalon= 40;
    }else { $typeJalon = 0; }
    J'ai encore des choses à voir car ça match pas encore bien, mais j'approche.

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((() = $ligne[3] =~ /\b(revue|d'achat)\b/g) >= 2) {
    }
    @Philou ta méthode est bonne mais tu peux matcher 2 fois 1 des mots et pas le second non?
    et donc si tu à 2 fois "Revue" dans une ligne, comment on fait

    @leilan: attention avec le multiligne de ne pas matcher trop de chose
    Attention aussi à l'ordre des regex, il faut mettre la plus discriminante en 1er; ex "Revue(.*)Bleue(.*)Ciel" avant "Revue(.*)Bleue" sinon, la plus discriminante ne matchera jamais

    Enfin, je pense que ton "last" n'est plus utile avaec les elsif

  13. #13
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    J'ai un script perl qui parcours une vielle base avec désignations presque toutes différentes.
    Dans la nouvelle base les désignations sont fixe et sont devenu des type jalon.

    Je dois passer les données de la vielle base à la nouvelle base. (xxx données)

    Alors lors de mon export j'essaie grâce a ses regex, de limité mon travail à la main afin de trouver à quel type jalon l'ancien appartient.

    Donc plus je traite de cas avec mes regex moins j'en aurai à faire à la main !

    J'ai 103 Projets et une centaines de jalons par projet.

    Ce n'est pas un texte donc mais des enregistrements =)

    voici une mini-mini liste de désignation :
    Revue de démarrage
    Revue besoins achats
    Revue de spécifications
    Revue de choix technique : Hard
    Revue de choix technique : 3D 300Kms
    Revue de choix technique : COWI
    Revue de choix technique : soft+DAS
    Réunion de lancement formation
    Revue de recette interne
    PV de reception provisoire
    Revue de passage en maintenance
    Plan Qualité
    Bilan de projet
    Revue de passage maintenance aprs chantier
    Revue de Contrat
    Revue de Conception
    - réunion
    - compte rendu
    Revue de Contrat Achats
    - matériel 1
    Revue de Recette
    - réunion
    - compte rendu
    Fiches de Démarrage
    Plan Assurance Qualité
    Description technique du Système
    Dossier de Spécification
    Traçabilité DSS-Contrat
    Cahier de Recette
    Traçabilité DSS-Cahier de Recette
    Dossier de Conception :
    - Générale
    - des Modules
    - des Matériels
    Plan de Gestion de Configuration
    Gestion des FOBS
    Manuel utilisateur
    Documentation Maintenance
    - Manuel Niveau 1
    il m'en reste 871 à matcher encore et je pense pouvoir faire la moitié si je gère les accents et les cas spéciaux que je vais définir.


    Donc ma question est maintenant comment je fait pour gérer les accents ?

  14. #14
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    @6ril23 : je n'utilise pas /g car perl me m’était une erreur et je veux pas qu'il soit fâché tu comprends ?? je fais assez de bêtises comme ça :p

    Je ne doit pas avoir tous les éléments pour permettre à perl de comprendre le groupe je sais qu'il manque des packages mais comme je suis en entreprise je ne vais pas m'amuser à y télécharger.

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    bon je te propose une autre solution car en prenant la précédente, si tu dois avoir +100 elsif...

    - tu fais une requête sur ton ancienne base pour avoir tous les messages comme "Revue de démarrage" (select distinct .....): si besoin tu l'affine en enlevant certains détails
    - tu mets cette liste dans un fichier dans lequel tu mets la correspondance dans ta nouvelle base (c'est par là qu'il faudra traiter les caractères spéciaux si besoin). ex format base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Revue de démarrage<##>New valeur1
    Revue besoins achats<##>New valeur2
    ...
    - tu charges ce fichier dans un hash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my %table;
    open (FH_IN, "Table_Correspondance.txt") or die "Pas ouverture fichier\n";
    while (<FH_IN>){
         my ($cle, $valeur) = split( '<##>', $_);
         $table{$cle}=$valeur;
    }
    - reprends ton traitement actuel et tu utilises la regex sur la partie que tu récupère: $monInfo =~ s/$anciennevaleur/$table{$anciennevaleur}/i

    modif: ajout paramètre "i" de la regex comme suggérer ci-dessous par @Philou

  16. #16
    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
    N'oublie pas l'option /i de la regexp, pour faire une recherche insensible à la casse
    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

  17. #17
    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 leilan Voir le message
    @6ril23 : je n'utilise pas /g car perl me m’était une erreur et je veux pas qu'il soit fâché tu comprends ?? je fais assez de bêtises comme ça :p
    Tu peux aussi essayer de chercher à comprendre où est l'erreur => tu en ressortiras grandi et tu n'en auras plus peur (car c'est quand même très utile dans bien des cas)
    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

  18. #18
    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
    Citation Envoyé par Philou67430 Voir le message
    Légère rectification : ce n'est pas une erreur, c'est une "warning" (cela ne génère pas d'exception, car c'est syntaxiquement et sémantiquement correct).
    D'ailleurs, le fait d'écrire @ligne[(3)] ne génère plus du tout de warning, tout en retournant la même chose que $ligne[3] ou @ligne[3].
    Cela dit, je plussoies au fait qu'il est important d'écrire $ligne[3] au lieu de @ligne[3] car l'expression que l'on cherche à récupérer est un scalaire, pas un tableau (donc sigil $ et pas @).
    Perl émet certes un warning, mais c'est une erreur d'écrire @a[2] cela quand on veut récupérer un scalaire.

  19. #19
    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
    Citation Envoyé par Philou67430 Voir le message

    N'est-ce pas plutôt les fonctions given/when qui sont dépréciées en 5.18, à peine introduites en 5.10 ? (et à mon grand regret).
    Effectivement la construction given/when est dépréciée à partir de la 5.18

    Le module Switch a été distribué avec Perl pendant quelque temps (module "core"), mais son usage a été déprécié en version 5.12 et il ne fait plus partie de la distribution standard depuis la version 5.14 (même si on peut toujours le trouver sur le CPAN, il n'a pas été maintenu et il faut absolument l'éviter avec les versions récentes de Perl). L'une des principales raisons de cette décision est précisément qu'il ne fonctionnait pas correctement avec certaines expressions régulières.

    Dans bien des cas, un hachage ou une table de distribution permet de se passer très bien d'un switch, mais ces solutions ne fonctionnent pas avec des regex. Dans le cas présent je pense que la construction avec des est la seule solution robuste et (relativement) simple.

  20. #20
    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
    Citation Envoyé par leilan Voir le message
    Merci à tous et j'ai beaucoup appris grâce à toi Philou67430.

    Alors la solution de 6ril23 est pas bonne mais je l'ai modifié et j'ai trouvé à peut près ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $typeJalon;
    if ($Ligne[3] =~ m/.*Revue.*d'achats.*/) {	$typeJalon = 12;
    }elsif ($Ligne[3] =~ m/.*Evaluation.*fournisseurs.*/){$typeJalon = 20;
    # ...
    C'est une mauvaise idée d'utiliser:
    car le quantificateur * est "gourmand" ou "avide" et cela force le moteur d'expression régulière à faire énormément de backtracking. Il est assez facile d'écrire une expression régulière qui prendrait des millions ou même des milliards d'années à s'exécuter en utilisant une petite dizaine de ".*" dans une regex sur une chaîne de quelques centaines de caractères (surtout s'il n'y a pas reconnaissance du motif). La solution proposée par Cyril utilisant un quantificateur non gourmand ("*?"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $typeJalon;
    if ($Ligne[3] =~ m/Revue.*?d'achats/i) {	$typeJalon = 12;
    }elsif ($Ligne[3] =~ m/Evaluation.*?fournisseurs.*/i){$typeJalon = 20;
    # ...
    est bien meilleure. J'ai aussi enlevé les ".*" en début et en fin de regex, car ils ne servent à rien (si ce n'est à plomber les performances).

    Tes regex initiales de type:
    ne fonctionnaient pas correctement parce qu'elles cherchent a reconnaître soit le mot "Revue", soit le mot "d'achats". Si bien que toute ligne ayant le mot "Revue" passait dans la première regex (et, donc, sautait les suivantes). C'était le message que je voulais faire passer, j'espère que c'est plus clair avec ces explications complémentaires.

    Une solution autre que celles proposées serait d'utiliser plusieurs regex sur la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if ($Ligne[3] =~ /Revue/i and $Ligne[3] =~ /d'achats/i ) {	$typeJalon = 12;
    # ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème avec un switch contenant des strings
    Par dessinateurttuyen dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2006, 13h56
  2. [Tableaux] Probleme avec les switch
    Par grumly22 dans le forum Langage
    Réponses: 9
    Dernier message: 10/04/2006, 11h51
  3. Probleme avec mon switch
    Par Fredovsky dans le forum C
    Réponses: 6
    Dernier message: 23/03/2006, 17h47
  4. [Système] Probleme avec un switch case!
    Par Death83 dans le forum Langage
    Réponses: 7
    Dernier message: 29/01/2006, 17h28
  5. Problème de Regex ... avec un point
    Par bugalood dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2005, 11h26

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