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 :

Substitution avec des hash


Sujet :

Langage Perl

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut Substitution avec des hash
    Je ne comprends pas d'ou provient mon erreur avec les valeurs de table dans les substitutions
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #!/usr/bin/perl -w
     
    use strict;
    use warnings;
     
    # preprocessing
     
    # fonction PoSTag2Xml qui recevra en entrée une chaîne de caractères et modifiera son contenu (sur place).
    sub PoSTag2Xml {
            #traitement des balises grammaticales 
     
            $_ =~ s/(\S*)\/(\S*)\b/<$2>$1<\/$2>/g;
     
            $_ =~ s/(\S*)\/``/<XOQT>$1<\/XOQT>/g;
            $_ =~ s/(\S*)\/,/<XCMM>$1<\/XCMM>/g;
            $_ =~ s/(\S*)\/:/<XCLN>$1<\/XCLN>/g;
            $_ =~ s/(\S*)\/\./<XPRD>$1<\/XPRD>/g;
            $_ =~ s/(\S*)\/''/<XCQT>$1<\/XCQT>/g;
            $_ =~ s/(\S*)\/"/<XDQT>$1<\/XDQT>/g;
            $_ =~ s/(\S*)\/\(/<XOPR>$1<\/XOPR>/g;
            $_ =~ s/(\S*)\/\)/<XCPR>$1<\/XCPR>/g;
     
           return $_;
    }
    my %tagsRE = (
            Noun => 'NN(||P|S|(PS)))|FW',
            Adj => 'JJ',
            Verb => 'VB(|D|G|N|P|Z)',
    );
     
    #créez ensuite une table associative wordsRE, ayant les mêmes clés que tagsRE, mais associant cette fois l’expression #régulière permettant de reconnaître la balise XML correspondante ainsi que son contenu.
    my %wordsRE = (
            Noun => "<$tagsRE{Noun}>(\\S*)</$tagsRE{Noun}>",
            Adj => "<$tagsRE{Adj}>(\\S*)</$tagsRE{Adj}>",
            Verb => "<$tagsRE{Verb}>(\\S*)</$tagsRE{Verb}>",
    );
     
    my %groupRE = (
    #les NounEntity, qui sont définies comme : – un groupe adjectif (Adj) optionnel (zéro ou plusieurs fois) suivi d’un nom
    #(Noun), – lequel est précédé d’un groupe optionnel constitué :
    #– d’un groupe adjectif (Adj) optionnel (zéro ou plusieurs fois) suivit d’un nom (Noun)
    #– possiblement suivit d’un <IN>of</IN> (zéro ou une fois).
            NounEntity => "($wordsRE{Adj}\\s)*$wordsRE{Noun}(($wordsRE{Adj}\\s)*$wordsRE{Noun}\\s)*(<IN>of<\/IN>\\s)?",
            #les VerbEntity sont définies comme un groupe adjectif (Adj) optionnel, zéro ou plusieurs fois, suivi d’un verbe
            VerbEntity =>"($wordsRE{Adj}\\s)*$wordsRE{Verb}",
    );
    # documents identifiés par des balises <DOCN> et 
    # </DOCN> sur une ligne séparée ("m" pour le début de ligne)
     
    open(WRITEFILE,">>file.txt");
    my %occurences;
    while(<>){
           if($_ =~ /^<DOC\d>/m) {
            # ignore this line
           }
           elsif( $_ =~ /<\/DOC\d>/m) {
           # ignore this line
           }else{
            my $newline = &PoSTag2Xml($_);
            &processEntities($newline,\%occurences);
            print WRITEFILE $newline ;
           }
    }
    close(WRITEFILE);
     
    #Écrivez ensuite la fonction processEntities qui recevra en entrée une chaîne de caractères et (en deux, voire une seule, #ligne(s) de Perl) modifiera son contenu (sur place) de sorte à étiqueter (format XML) toutes les expressions de groupeRE #contenue dans cette chaîne de caractères.
     
    sub processEntities {
            ($line, $ref)=@_;
            $line =~ s/($groupRE{NounEntity})/<NounEntity>$1<\/NounEntity>/eg;
            $line =~ s/($groupRE{VerbEntity})/<VerbEntity>$1<\/VerbEntity>/eg;
            return $_;
    }

  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
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Peux-tu :
    1. préciser quel est le problème que tu rencontres;
    2. donner des exemples de tes lignes en entrée et du format espéré en sortie, pour chaque fonction
    3. expliquer à quoi est censée servir la variable $ref dans la fonction processEntities, elle ne semble pas être utilisée
    4. ta fonction processEntities manipule la variable $line et renvoie $_. Ca ressemble fortement à un bug.

    J'ajoute que, d'un point de vue du style, si tu utilises $_, tu peux souvent te passer d'y référer explicitement.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while(<>){
           if($_ =~ /^<DOC\d>/m) {
            # ignore this line
           }
           elsif( $_ =~ /<\/DOC\d>/m) {
           # ignore this line
           }else{
            my $newline = &PoSTag2Xml($_);
            ...
    peut être réécrit plus économiquement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(<>){
           next if  /^<DOC\d>/m or/<\/DOC\d>/m;
           my $newline = &PoSTag2Xml($_);
           ...

    ou même encore plus simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(<>){
           next if  /^<\/?DOC\d>/m ;
           my $newline = &PoSTag2Xml($_);
           ...
    (Le quantifieur ? spécifie 0 ou 1 occurrence du "/" précédent).

    De même,

    peut s'écrire plus simplement:

    car dans ce cas, l'opérateur s// sait qu'il doit travailler sur $_.

Discussions similaires

  1. [sed ou bash] substitution avec des '/'
    Par pfxxx dans le forum Linux
    Réponses: 2
    Dernier message: 17/08/2010, 14h17
  2. Réponses: 2
    Dernier message: 22/03/2007, 11h01
  3. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 16h11
  4. Réponses: 2
    Dernier message: 06/12/2002, 07h50
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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