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 !!!

  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 !!

  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).

+ 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, 15h43
  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, 15h31
  3. Réponses: 2
    Dernier message: 23/03/2006, 13h39
  4. Réponses: 11
    Dernier message: 22/03/2006, 22h57
  5. Réponses: 4
    Dernier message: 20/08/2004, 11h59

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