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 :

[REG EXPR][REMPLACER][QUOTEMETA] petit problème incompréancible


Sujet :

Langage Perl

  1. #1
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut [REG EXPR][REMPLACER][QUOTEMETA] petit problème incompréancible
    Bonjour,

    j'ai un problème difficilement compréencible : j'ai une petite fonction qui me sert à remplacer une chaine par une autre dans un text. Cette fonction marche très bien dans tout un tas de scripts que j'ai écrit... Sauf dans le dernier.

    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
     
    sub remplacerLaChaineMatchee
    {
    	if (@_ == 2)
    	{
    		my $chaineDOrigine = @_[0] ;
    		my $chaineTransforme = @_[1] ;
    		print ("\nchaineDOrigine = ".$chaineDOrigine."\n") ;
    		print ("chaineTransforme = ".$chaineTransforme."\n") ;
     
    		# on prefixe tous les caractaitres speciaux par \    
    		$chaineDOrigine = quotemeta($chaineDOrigine);
     
    		# on remplace toutes les occurence de cette chaine
    		print (" =~ s|$chaineDOrigine|$chaineTransforme|gm ;\n") ;
    		$txtRes =~ s|$chaineDOrigine|$chaineTransforme|gm ;
    	}
    	else
    	{
    		die ("\nLa methode remplacerLaChaineMatchee prend 2 arguments."
    			."\nElle à était appelée avec ".@_." argument(s).") ;
    	}
    }
    resultat :
    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
     
    chaineDOrigine = REM
    chaineTransforme = /*REM*/
     =~ s|REM|/*REM*/|gm ;
     
    chaineDOrigine = REM    Infos SCCS : %W% %G%
    chaineTransforme = /*REM        Infos SCCS : %W% %G%*/
     =~ s|REM\      Infos\ SCCS\ \:\ \%W\%\ \%G\%|/*REM     Infos SCCS : %W% %G%*/|gm ;
     
    chaineDOrigine = REM    AnaisTransferCreateTables.sql
    chaineTransforme = /*REM        AnaisTransferCreateTables.sql*/
     =~ s|REM\      AnaisTransferCreateTables\.sql|/*REM    AnaisTransferCreateTables.sql*/|gm ;
     
    chaineDOrigine = REM    Creation of transfer tables:
    chaineTransforme = /*REM        Creation of transfer tables:*/
     =~ s|REM\      Creation\ of\ transfer\ tables\:|/*REM  Creation of transfer tables:*/|gm ;
     
    chaineDOrigine = REM ****************************************************************************
    chaineTransforme = /*REM *****************************************************************************/
     =~ s|REM\ \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*|/*REM *****************************************************************************/|gm ;
    Jusque là on pourait penser que ça va marcher...

    Et ben non : dans le fichier résultat j'ai systèmatiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /*REM*/ la suite de la ligne


    Si quelqu'un comprend...

    ++floanne

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Que vaut $txtRes dans l'exemple qui ne fonctionne pas?
    Tu parles d'un problème lors de l'écriture dans un fichier mais qu'est ce que tu y écris exactement?


    Jasmine,
    -- Jasmine --

  3. #3
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    $txtRes contient le fichier d'origine, puis le résultat. C'est cette variable qui est écrite dans le fichier...

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tu demandes donc à ton programme de modifier
    REM\ \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
    en
    /*REM *****************************************************************************/
    Chez moi ta fonction me retourne bien ce que tu veux avoir ... donc, je ne comprends pas ton probème.

    Voici mon programme
    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
    use strict;
    use warnings;
     
    my $txtRes = "blabla REM\ \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* blabla";
     
    my $chaineDOrigine = "REM ****************************************************************************" ;
    my $chaineTransforme = '/*REM *****************************************************************************/' ;
    print ("\nchaineDOrigine = ".$chaineDOrigine."\n") ;
    print ("chaineTransforme = ".$chaineTransforme."\n") ;
     
    # on prefixe tous les caractaitres speciaux par \
    $chaineDOrigine = quotemeta($chaineDOrigine);
     
    # on remplace toutes les occurence de cette chaine
    print (" =~ s|$chaineDOrigine|$chaineTransforme|gm ;\n") ;
    $txtRes =~ s/$chaineDOrigine/$chaineTransforme/gm ;
    print "$txtRes\n";
    -- Jasmine --

  5. #5
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    En fait il ne falait pas mettre les \ devant les *... quotemeta permet d'ajouter des \ devant tous les caractaires spéciaux pour pouvoir matcher la chaine dans une reg epxr (ici $txtRes =~ s/...)

    Mais ça ne change rien ton prog marche chez moi aussi...

    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
     
    use strict;
    use warnings;
     
    my $txtRes = "blabla \nREM ****************************************************************************\n blabla";
     
    my $chaineDOrigine = "REM ****************************************************************************" ;
    my $chaineTransforme = '/*REM *****************************************************************************/' ;
    print ("\nchaineDOrigine = ".$chaineDOrigine."\n") ;
    print ("chaineTransforme = ".$chaineTransforme."\n") ;
     
    # on prefixe tous les caractaitres speciaux par \
    $chaineDOrigine = quotemeta($chaineDOrigine);
     
    # on remplace toutes les occurence de cette chaine
    print (" =~ s|$chaineDOrigine|$chaineTransforme|gm ;\n") ;
    $txtRes =~ s/$chaineDOrigine/$chaineTransforme/gm ;
    print "$txtRes\n";
    Merci beaucoup, je vais chercher encore...

    ++floanne.

  6. #6
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    j'ai compri.

    La première chaine que je matche est "REM"...
    Donc je remplace toutes les occurances par "/*REM*/" puis les autre chaine qui commancent par "REM" ne sont pas matchées puisque toutes les occurances de REM on étaient modifiées...

    Merci Jasmine80 pour le coup de mains : c'est ton petit prog qui m'a permis de faire tilt...

    ++floanne.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/07/2008, 20h40
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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