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 :

[Perl] Problème de remplacement de chaine de caractères


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [Perl] Problème de remplacement de chaine de caractères
    Bonjour à tous !!

    J'ai un gros problème ...

    Je vous explique.

    a travers un formulaire, je veux récupérer des données qui vont me servir à créér un message à partir d'un message template.

    Voici à quoi ressemble mon message template:
    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
     
     
     
    UNB+UNOA:1+[T_SUPPLIER_IDENTIFICATION]:14+[T_CUSTOMER_IDENTIFICATION]:14+[T_DATE]:[T_HOUR]+[T_COUNT]++INVOICE+++EANCOM
    UNH+56+INVOIC:D:93A:UN:EAN007
    BGM+325+[T_COUNT]
    DTM+137:[T_DATE]:102
    RFF+ON:[T_ORDER_REFERENCE]
    RFF+AAK:[T_BOL_REFERENCE]
    DTM+171:[T_DATE]:102
    NAD+BY+[T_CUSTOMER_IDENTIFICATION]::9
    NAD+SU+[T_SUPPLIER_IDENTIFICATION]::9
    NAD+DP+[T_CUSTOMER_IDENTIFICATION]::9
    CUX+2:DEM:10
    LIN+1++[T_EAN_CODE]:EN::9
    PIA+5+[T_SUPPLIER_CODE]:SA+[T_CUSTOMER_CIDE]:IN
    QTY+47:[T_QUANTITY]:[T_UNIT_OF_MEASURE]
    MOA+203:[T_NET_AMOUNT]
    PRI+AAA:[T_UNIT_PRICE]:[T_UNIT_PRICE_MEASURE]
    TAX+7+VAT+++:::[T_VAT_RATE]+S
    MOA+125:[T_NET_AMOUNT]
    UNS+S
    MOA+9:[T_TOTAL_AMOUNT]
    TAX+7+VAT+++:::[T_VAT_RATE]+S
    MOA+176:[T_VAT_AMOUNT]
    UNT+22+01
    UNZ+1+[T_COUNT]

    A travers un formulaire CGI je récupère mes variables passées qui ont pour nom ce qui est entre crochet dans le message template.
    Ensuite je place ses variables dans un hash %VAR.
    Tout ceci fonctionne bien
    Mais lorsque je veux remplacer mes [...] du message template par les données récupérées du formulaire, j'obtiens un résultat très bizarre


    Voici le script qui récupère les données du formulaire et créé un message:
    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
    40
    41
    42
    43
     
     
     
    #!c:\perl\bin\perl.exe
     
    use TX2::Web::Session;
    use TX2::Tools;
    $cgi = new CGI;
    $session=&TX2::Web::Session::Verify($cgi->param("CGISESSID"));
     
    $id=$session->id();
    @params = $cgi->param();
     
    $paf_template = '../paf.template';
     
    open(FIC,$paf_template) or die "Error opening $paf_template $!\n";
    $TEMPLATE = join("",<FIC>);
    close(FIC);
     
     
    print "Content-type:text/html\n\n";
     
     
    #Génération d'un identifiant unique que l'on place dans le hash %VAR
    $VAR{'[T_COUNT]'} = &TX2::Tools::Generate();
     
    #Récupération des données du formulaire dans le hash %VAR
    foreach(@params)
    {
          $VAR{'['.$_.']'} = $cgi->param($_);
    }
     
     
    #On remplace tous les "tags" du template par le contenu du formulaire (contenu dans le hash %VAR)
     
    foreach my $keys (keys %VAR)
    {
        $TEMPLATE=~s/$keys/$VAR{$keys}/msgi;
    }
     
     
     
    print "$TEMPLATE\n<BR>";

    Et voici à quoi ressemble $TEMPLATE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     
    UPUP50UPUP6UP901000150UPUP6UP9010001+UPUP301576UP00708301576UP00708:UP+[UPUP301576UP00708UPUPUP301576UP00708UPUPUPUPUP301576UP00708UPUPUPUP301576UP00708UPUP301576UP00708UPUP301576UP00708UP]:UP4+[UPUPUPUP301576UP00708UP301576UP00708UPUPUPUPUP301576UP00708UPUPUPUP301576UP00708UPUP301576UP00708UPUP301576UP00708UP]:UP4+[UPUP301576UP00708301576UP00708UPUP]:[UPUP10301576UP00708UPUP]+[UPUPUP301576UP00708UPUPUP]++UPUPUPxUPUP103g301576UP00708UPUPUP+++UP301576UP00708UPUP301576UP00708UP UPUP10+56+UPUPUPxUPUP103g301576UP00708UPUP:301576UP00708:93301576UP00708:UPUP:UP301576UP00708UP007 50UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP9010001550UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP9010001UP99UP50UPUP6UP901000150UPUP6UP901000183388550UPUP6UP901000137950UPUP6UP901000101350UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP901000150UPUP6UP901000151UP+3UP5+[UPUPUP301576UP00708UPUPUP] 301576UP00708UPUP+UP37:[UPUP301576UP00708301576UP00708UPUP]:UP0UP UP301576UP00708301576UP00708+301576UP00708UP:[UPUP301576UP00708UP301576UP00708UPUPUPUPUP301576UP00708UPUPUPUPUPUP] UP301576UP00708301576UP00708+301576UP00708301576UP00708K:[UPUP50UPUP6UP901000150UPUP6UP9010001301576UP00708301576UP00708UPUPUP301576UP00708UPUPUPUPUPUP] 301576UP00708UPUP+UP7UP:[UPUP301576UP00708301576UP00708UPUP]:UP0UP UP301576UP00708301576UP00708+50UPUP6UP901000150UPUP6UP90100011+[UPUPUPUP301576UP00708UP301576UP00708UPUPUPUPUP301576UP00708UPUPUPUP301576UP00708UPUP301576UP00708UPUP301576UP00708UP]::9 UP301576UP00708301576UP00708+301576UP00708UP+[UPUP301576UP00708UPUPUP301576UP00708UPUPUPUPUP301576UP00708UPUPUPUP301576UP00708UPUP301576UP00708UPUP301576UP00708UP]::9 UP301576UP00708301576UP00708+301576UP00708UP+[UPUPUPUP301576UP00708UP301576UP00708UPUPUPUPUP301576UP00708UPUPUPUP301576UP00708UPUP301576UP00708UPUP301576UP00708UP]::9 UPUPX+UP:301576UP00708UPUP:UP0 301576UP00708UPUP+UP++[UPUPUP301576UP00708UPUPUP301576UP00708301576UP00708UP]:UPUP::9 UPUP301576UP00708+5+[UPUP301576UP00708UPUPUP301576UP00708UPUPUPUPUP301576UP00708301576UP00708UP]:301576UP00708301576UP00708+[UPUPUPUP301576UP00708UP301576UP00708UPUPUPUPUPUP301576UP00708UP]:UPUP 1UP1+47:[UPUP1UP301576UP00708UPUPUPUP1]:[UPUPUPUPUPUPUP301576UP00708301576UP00708UPUPUP301576UP00708301576UP00708UPUPUP] UP301576UP00708301576UP00708+UP03:[UPUPUPUPUPUP301576UP00708UP301576UP00708UPUPUP] UPUPUP+301576UP00708301576UP00708301576UP00708:[UPUPUPUPUPUPUPUPUPUPUPUP]:[UPUPUPUPUPUPUPUPUPUPUPUPUPUPUP301576UP00708301576UP00708UPUPUP] UP301576UP00708X+7+UPxUPUP103g301576UP00708UP+++:::[UPUPUPxUPUP103g301576UP00708UPUPUP301576UP00708UPUP]+301576UP00708 UP301576UP00708301576UP00708+UPUP5:[UPUPUPUPUPUP301576UP00708UP301576UP00708UPUPUP] UPUP301576UP00708+301576UP00708 UP301576UP00708301576UP00708+9:[UPUPUP301576UP00708UP301576UP00708301576UP00708UP301576UP00708UP301576UP00708UPUPUP] UP301576UP00708X+7+UPxUPUP103g301576UP00708UP+++:::[UPUPUPxUPUP103g301576UP00708UPUPUP301576UP00708UPUP]+301576UP00708 UP301576UP00708301576UP00708+UP76:[UPUPUPxUPUP103g301576UP00708UPUP301576UP00708UP301576UP00708UPUPUP] UPUPUP+UPUP+0UP UPUPZ+UP+[UPUPUP301576UP00708UPUPUP]

    je pense bien qu'il y a un problème dans la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    #On remplace tous les "tags" du template par le contenu du formulaire (contenu dans le hash %VAR)
     
    foreach my $keys (keys %VAR)
    {
        $TEMPLATE=~s/$keys/$VAR{$keys}/msgi;
    }
    mais quel est le problème ???

    merci grandement pour votre aide précieuse !!!
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Oups, j'ai trouvé ...
    Le problème vient du fait de mes identifiant.

    Chaque identifiant est englobé entre crochets [...]
    Et ces crochets sont interpétés par perl dans mon expression régulière.

    d'après la faq, lorsque l'on mets une chaine de caractère entre crochet, cela revient à opérer sur quelqconque caractère présent entre crochet.

    Voilà donc poursuoi j'obtenais ces résultats bizarres.

    Ainsi, j'ai remplacé les [] par des {} et tout fonctionne bien ...
    Quel idiot


    Bonne journée !!
    tout le monde est d'accord pour critiquer la pensée unique

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu devrais conserver tes [ ] et simplement te contenter de passer tes clés à quotemeta() (qui échappe tous les caractères qui auraient un sens particulier dans une regex, ce qui te permet d'utiliser de façon littérale une variable dans une regex).

    Par ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $TEMPLATE = join("",<FIC>);
    n'est pas très efficace, je préfère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $TEMPLATE = do { local $/; <FIC> };
    (ce qui évite de découper le fichier pour ensuite tout regrouper)

    --
    Jedaï

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bonjour Jedaï !
    Merci pour ta réponse !!

    Je vais changer le join(). je ne connaissais pas l'autre syntaxe !

    Mais je n'ai pas bien compris ceci:
    Tu devrais conserver tes [ ] et simplement te contenter de passer tes clés à quotemeta() (qui échappe tous les caractères qui auraient un sens particulier dans une regex, ce qui te permet d'utiliser de façon littérale une variable dans une regex).
    tout le monde est d'accord pour critiquer la pensée unique

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

Discussions similaires

  1. Perl- probléme d'extraction de chaine de caractères
    Par shad797 dans le forum Langage
    Réponses: 4
    Dernier message: 18/08/2009, 14h43
  2. [RegEx] Gros problème de remplacement de chaines de caractères
    Par matamine dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2009, 14h31
  3. Réponses: 2
    Dernier message: 23/03/2006, 12h39
  4. Réponses: 11
    Dernier message: 22/03/2006, 21h57
  5. Réponses: 4
    Dernier message: 20/08/2004, 10h59

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