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 :

reutiliser $1 comme mémoire regex dans un même bloc


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Points : 14
    Points
    14
    Par défaut reutiliser $1 comme mémoire regex dans un même bloc
    Bonjour bonjour!

    Alors j'ai un problème avec ma fonction suivante:
    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
    sub substitution {
    	my ($ligneAModifier, $limite1 ,$limite2 , $motARemplacer, $motDeRemplacement) = @_;
    	my ( $val1, $val2) = split(/$limite1/i, $ligneAModifier , 2);
    	my ( $val3, $val4) = split(/$limite2/i, $val2, 2);
    	recuperation($val3);
    	while ($val3 =~ /(\S.+)+/){
    		while ($1 =~ /([a-zA-Z_]+[0-9]+)+/){
    			if ($fichierAComparer =~ $1){
    			}
    			else{
    				$1 =~ s/$motARemplacer/$motDeRemplacement->()/ge;
    			}
    		}
    	}
     
    	return $val1."$limite1".$val3."$limite2".$val4;
    }
    Et pour être plus exact avec ce bout la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($val3 =~ /(\S.+)+/){
    	while ($1 =~ /([a-zA-Z_]+[0-9]+)+/){
    		if ($fichierAComparer =~ $1){
    		}
    		else{
    			$1 =~ s/$motARemplacer/$motDeRemplacement->()/ge;
    		}
    	}
    }
    while ($val3 =~ /(\S.+)+/) me sert à parcourir "ligne par ligne" $val3, qui est un bout de VBcode,
    qui n'a pas de \n (ils sont en ASCII),
    à chaque ligne je regarde si il trouve des mots contenant des lettres ET des chiffres while ($1 =~ /([a-zA-Z_]+[0-9]+)+/),
    ce qui dans mon cas est un nom de "bouton" d'interface graphique,
    et la if ($fichierAComparer =~ $1) je regarde si le nom trouvé est present dans $fichierAComparer,
    qui n'est autre que une copie du fichier sur lequel je travail sans $val3 qui est le bloc sur lequel ce bout travail.
    Si il est présent je ne fait rien, sinon je remplace par les valeur donné dans la fonction en paramètre.

    Alors MON PROBLEME:
    Comment faire pour que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    else{
    	$1 =~ s/$motARemplacer/$motDeRemplacement->()/ge;
    }
    S'applique sur le premier $1 et non le deuxieme de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($val3 =~ /(\S.+)+/){
    	while ($1 =~ /([a-zA-Z_]+[0-9]+)+/){
    		if ($fichierAComparer =~ $1){
    Je sèche un peu... car maintenant mon programme tourne, tourne, tourne, tourne.... et mon ventilo aussi .
    Voila merci d'avance.

  2. #2
    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
    Pas bien sûr d'avoir compris ton problème ni de bien comprendre ce que cherche à faire ton code, mais essaie ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while ($val3 =~ /(\S.+)+/){
         my $first_match = $1;
         while ($first_match =~ /([a-zA-Z_]+[0-9]+)+/){
              my $second_match = $1;
              while ($first_match =~ /([a-zA-Z_]+[0-9]+)+/){
              # ...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    EDIT: ça ne marche pas non plus, mais à vrai dire je commence à croire que ce sont mes regexs qui pause probleme,
    ça boucle de manière infini sur le premier while.

    EDIT 2:
    Enfaite ce que que veux c'est que dans: (je n'ai pas tout mit car c'est beaucoup trop loong)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imports Microsoft.VisualBasic
Imports System
Imports OASySDNA.Common
Imports OASySDNA.Common.Config
Imports OASySDNA.Common.PubSub
Imports OASySDNA.ClientFormsSDK
Imports System.Runtime.InteropServices
Imports System.Collections
Imports System.Globalization
Imports System.Text
Imports OASySDNA.XOS.Scripting.VB
Imports System.Collections.Generic
Imports OASySDNA.XOS

NameSpace OASySDNA.XOS.Scripting
				Public Class GEO_RVS_BEAUCE
		Inherits VBScriptBase

		Dim FullViewFlag As Boolean

		#Region "Auto-Generated Control Members"
		Friend WithEvents SEGM06928 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12122 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12124 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12126 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12128 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12135 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12138 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12526 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12527 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12528 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12530 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12538 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12546 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12549 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12550 As OASySDNA.XOS.MTPDynamicPolyline
		Friend WithEvents SEGM12551 As OASySDNA.XOS.MTPDynamicPolyline

    Il me prenne chaque phrase representé par la regex \S.+
    puis dans chacune de ses phrases qu'il regarde si il trouve un truc comme ça SEGM12122 ou n'importe quel nom avec chiffre et numero représenté par [a-zA-Z_]+[0-9]+

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Il me prenne chaque phrase representé par la regex \S.+
    Dis plutôt en français (et non en termes de regex) ce que tu veux. Parce que ta regex ne fait pas du tout ce que tu penses probablement.

    Elle recherche un caractère autre qu'un caractère blanc, suivi du plus grand nombre possible de caractères quelconques (à l'exception du saut de ligne dans certains cas). Autrement dit, tu captures toute la ligne. Ce n'est sans pas ce que tu cherches, puisque tu as déjà la ligne dans ta variable.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Je veux que dans le gros bout de code il regarde chaque phrase une par une finissant par \n (ici en ascii je crois)
    et que dans chacune de ces phrases, il regarde si il y a un truc du genre fgqsfgqeg_45634 ou gqegedf56446 ou autre similaire

  6. #6
    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
    Tu veux dire que variable $val3 contient un texte multiligne?

    Dans ce cas, tu peux par exemple splitter $val3 en un tableau de lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @values3 = split /\n/, $lignes;
    et traiter ensuite les éléments de ce tableau un par un.

    Ou tu peux ouvrir un filehandle sur une référence à ta variable et lire le filehandle comme un fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open my $FH, \$val3 or die "Ouverture impossible de $val $!";
    while (my $line = <$FH>) {
         chomp $line;
         # ...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    (Désolé de ne pas avoir répondu ce weekend mais je serais devenu fou si j'avais continué à travailler dessus ).

    Donc encore merci pour les réponses Lolo78.

    Bon alors j'ai retravaillé le code avec tes idées et ça donne ç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
    sub substitution {
    	my ($ligneAModifier, $limite1 ,$limite2 , $motARemplacer, $motDeRemplacement) = @_;
    	my ( $val1, $val2) = split(/$limite1/i, $ligneAModifier , 2);
    	my ( $val3, $val4) = split(/$limite2/i, $val2, 2);
    	recuperation($val3);
    	my @tabval3 = split((/&#xA;/), $val3);
    	foreach my $item (@tabval3){
    		if ($item =~ /([a-zA-Z_]+[0-9]+)+/g){
    			my $first_match = $1;
    			if ($fichierAComparer =~ /$first_match/){
    			}
    			else{
    				$item =~ s/$motARemplacer/$motDeRemplacement->()/ge;
    			}
    		}
    		else{
    		}
    	}
    	$val3 = join(("&#xA;"), @tabval3);
    	return $val1."$limite1".$val3."$limite2".$val4;
    }
    Et le mieux dans tout ça c'est que ça marche!

    Lolo78

    Bon bah merci beaucoup, c'est toujours sympa d'arriver le lundi et de régler un soucis.

    Bonne journée à toi.

  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
    L'usage de $1, $2, ... (variables automagiques issus de l'effet de bord de l'exécution d'une regexp) me semblent être à éviter dans la mesure du possible. Et c'est presque toujours le cas possible avec cette construction.
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ($item =~ /([a-zA-Z_]+[0-9]+)+/g){
      my $first_match = $1;
    écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (my ($first_match) = $item =~ /([a-zA-Z_]+[0-9]+)+/g){
    En plus, ça à l'avantage d'être plus concis, plus "significatif" et plus sûr (impossible que $first_match soit affecté par une modification de $1 entre l'exécution de regexp et celui de son affectation ... ce qui n'est pas garanti quand on commence à faire de la maintenance sur le code avec l'usage explicite de $1, quand ce n'est pas déjà le cas dès le départ).
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Bonjour Philou67430 ,

    C'est noté, merci du conseil, ça me sera utile surtout que je pense que je vais m'en servir souvent à l'avenir!
    (ligne changé dans mon programme )

    Bonne journée.

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

Discussions similaires

  1. Lettre et chiffre dans une même case mémoire
    Par isrdum dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/05/2012, 03h58
  2. [RegEx] Regex multiple dans un même texte
    Par tete-jaune dans le forum Langage
    Réponses: 5
    Dernier message: 14/09/2011, 15h20
  3. Réponses: 4
    Dernier message: 31/08/2010, 17h45
  4. Réponses: 3
    Dernier message: 15/04/2004, 08h44
  5. Résultats dans une même colonne.
    Par souellet dans le forum Langage SQL
    Réponses: 6
    Dernier message: 10/03/2004, 19h51

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