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 !