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 : Inconnue $'


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant Informatique & Linguistique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Informatique & Linguistique

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Points : 7
    Points
    7
    Par défaut PERL : Inconnue $'
    Bonsoir !

    Problème :
    Voilà j'ai un code à faire tourner, que j'ai pas mal de difficulté à comprendre, en particulier à cause d'une inconnue :
    En fait j'aurai besoin de savoir à quoi cette chose sert.

    Objectif du programme
    En substance, le code prend un fichier de patron syntaxique (PREP, NCMS, ...) et un autre fichier texte traité par CORDIAL.
    Dans le fichier de patron se trouve la suite que l'on cherche : PREP NCMS. Donc dès qu'il chope dans le fichier CORDIAL une suite syntaxique qui matche, il la conserve.


    Aspect du contenu du fichier CORDIAL

    Dans le fichier PATRON comme dans le fichier CORDIAL, les éléments sont séparés par une tabulation.
    de de PREP
    cinéma cinéma NCMS
    . . PCT
    PCT vaut pour Ponctuation.

    Le code

    Voici le code, le symbole se trouve à la ligne 46

    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
    75
    #
    open (OUT, ">OUT.txt");
    open(TERMINO,"$ARGV[0]");
    #print $ARGV[0];
    while (my $terme=<TERMINO>) 
    { # je lis chq terme de mon fichier PATRON 
        #print $terme;
        chomp($terme); #on supprime le dernier élément de la string 
    	$terme=~s/ +/ /g; # on supprime les +
    	$terme=~s/\r//g; # on supprime les retour chariot 
    	print "$terme\n"; # on affiche le patron 
     
    # CORDIAL 
     
    	open(CORDIAL,"$ARGV[1]"); # on ouvre le fichier CORDIAL
    	while (my $ligne=<CORDIAL>)
    	{ # on lit ligne à ligne
    	    chomp($ligne); # on supprime le dernier caractère 
    		$ligne=~s/\r//g; # on supprime le retour chariot 
    		if ($ligne!~/PCT/)
    		{ # si la liste n'est pas composé de PCT
    		    my @LISTE=split(/\t/,$ligne); #on met le contenu de la ligne de CORDIAL tout ce qui se trouve entre les tabulations dans la LISTE
    			push(@POS,$LISTE[2]); # le PATRON se trouve à l'indice 2 de la liste
    			push(@TOKEN,$LISTE[0]); #le token se trouve à l'indice 0
    		} # on a : @pos {PREP} et @token {de}
    	    else
    	    {
                #print "<@TOKEN>\n";
               # print "<@POS>\n";
               # print "TERME CHERCHE:$terme \n";
                my $a=<STDIN>;
     
    			my $pos=join("\t", @POS); #il sépare tous les éléments de la liste 
    			print "voilà la suite de patrons dans le fichier cordial pour une seule phrase : ".$pos."\n";
    			my $token=join("\t",@TOKEN);
    			print "voilà les tokens dans le fichier cordial pour une seule phrase : ".$token."\n";
    			my $cmptdetrouvage=0;
     
    			while($pos=~/$terme/g)
    			{ # tant que dans CORDIAL, il y a un PATRON, alors 
    			    $cmptdetrouvage++; # on incrémente le compteur 
    				print "J'ai trouvé le PATRON \'".$terme."\' de patron.txt dans le fichier CORDIAL"."\n";
    				#print "TROUVE $cmptdetrouvage fois \n";
    				print "$terme est bien dans $pos \n";
     
    				my $avantcorespondant=$`; 
    				my $comptagedeblancdansterme=0;
     
    				while($terme=~m/\t/g) # tant qu'il y a un espace dans le PATRON 
    				{
    				    $comptagedeblancdansterme++; # on incrémente 
    				    print "Il y a : ".$comptagedeblancdansterme." blancs dans termes"."\n";
    				}
     
    				my $comptagedeblanc=0;
     
    				while($avantcorespondant=~m/\t/g) # tant qu'il y a un blanc dans la variable
    				{
    				    $comptagedeblanc++; #on incrémente comptage de blanc
    				    print "Il y a : ".$comptagedeblanc." blancs dans ?"."\n";
    				}
     
    				for(my $i=$comptagedeblanc; $i<=$comptagedeblanc + $comptagedeblancdansterme; $i++)
    				{
    				    print OUT $TOKEN[$i]." ";
    				}
    					print OUT "\n";
    			}
                @POS=();
                @TOKEN=();
    		}
    	}
        close(CORDIAL);
    }
    close(TERMINO);
    Votre aide serait la bienvenue !

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    $` n'est pas une inconnue, mais une variable spéciale.

    Après une reconnaissance de motif d'expression régulière, cette variable contient la chaîne de caractères précédant ce qui a été reconnu lors de la dernière reconnaissance réussie de motif d'expression régulière.

    Cela dit, je ne l'ai jamais utilisée, je pense, et ai un peu de mal à en voir l'intérêt.

    Et je n'ai rien compris à tes PATRONS et CORDIAL.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je pense que l'intérêt à l'origine, hormis le sucre syntaxique, est de pouvoir trouver la sous-chaîne précédant une correspondance sans recourir à un quantificateur "non gourmand" (genre (.*?)pattern) dont le coût est plus élevé(*) et sans définir un nouveau groupe de capture.

    Néanmoins ce raccourci est à éviter car il peut gréver considérablement les performances; si on l'utilise ne serait-ce qu'une seule fois dans un script, Perl le rendra disponible ainsi que ces consœurs $& et $' pour toutes les recherches suivantes, ce qui génère des copies inutiles de la chaîne d'origine.

    Des alternatives à cette syntaxe sont disponibles dans la documentation.

    (*) Certains moteurs sont assez malins pour trouver à l'avance les emplacements possibles de pattern lors d'une phase de pré-analyse par un algorithme de recherche rapide quand celle-ci commence par une chaîne littérale avant même la marche normal du moteur. De la même manière, il n'est pas impossible qu'une pattern commençant par .*? puisse également bénéficier d'une optimisation qui consiste à directement chercher la position de ce qui suit. Mais ce genre de procédure se devant d'être très rapide, l'ajout d'un simple groupe pourrait la faire abandonner.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Etudiant Informatique & Linguistique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Informatique & Linguistique

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Parfait, merci ça m'a bcp aidé !

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

Discussions similaires

  1. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  2. [langage] Inclure de perl en c !!!
    Par ryo00 dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2002, 10h03
  3. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  4. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 17h22
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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