#!/usr/bin/perl
use utf8;
#binmode STDOUT, ":utf8"; # afficher tous les caractères
<<DOC; 
Nom : YU Xin
Date : 20/03/2019 ; 03/04/2019
usage : perl script.pl fichier_talismane_sortie.txt fichier_terminologie.txt
perl5.28.0.exe bao3_yu_extraitTalismane.pl bao2-sortie-3476-talismane.txt bao3_termino.txt
DOC

my $filetalismane=$ARGV[0];
my $filetermino=$ARGV[1];
open my $fileT,"<:encoding(UTF-8)", $filetalismane;

# pour ouvrir le fichier termino
<<DOC; 
# ouvrir une fois le fichier contenant tous les patrons
{
local $/=undef;
open my $fileTer,"<:encoding(UTF-8)", $filetermino;
$termino = <$fileTer>;
close $fileTer;
}
DOC
# au lien de faire ça(local), on fait
open my $fileTer,"<:encoding(UTF-8)", $filetermino;
my @TERMINO = <$fileTer>;
close $fileTer;

my %dicotmp=(); # déclaration d'un dictionnaire temporaire / hash
my %dicoPatron=();
my $nbTerme=0;
#my $phrasetmp="";
while (my $ligne = <$fileT>) {
	# nettoyage des bruits
	#next if ($ligne =~ /££/) or ($ligne =~ /^##/) or ($ligne =~ /^$/) ; #next if ($ligne =~ /££||^##||^$/)
	#print $ligne;
	# isoler les phrases
	if ($ligne !~/^$/) {# si la ligne n'est pas vide
		# pour remplir le dicotmp on va examiner la ligne lue
		# décomposer la ligne en 2 éléments : l'index sera la clé, le reste la valeur
		$ligne =~ /(^\d+)\t(.+?)$/; # \d : digit
		my $cle =$1;
		my $valeur = $2;
		# transformer le reste/valeur en une liste de scalar
		my @listevaleur = split(/\t/,$valeur);
		#print @listevaleur;
		#$phrasetmp .=$valeur;
		# remplir le dictionnaire. \@listevaleur est un pointeur vers la liste car un hash(%) associe un scalar et un autre mais pas un scalar et une liste=array. 
		# donc \@listevaleur est des références/adresses
		# %dico sera initialisé à chaque itération		
		$dicotmp{$cle} =\@listevaleur;	
	}
	else {
		#print $phrasetmp, "\n";
		
		#------extraction----
		my $phrase="";
		# on veut que le 1er et 3ère éléments dans la $phrasetmp qui sont aux indices 0 et 2
		#contextuellement, la fonction keys renvoie une liste donc on doit en fait écrire @longueur = keys %dicotmp; qui va renvoie une liste de clés. quand on écrit $longueur = keys %dicotmp; $longueur est un scalar, il va envoyer la longueur de la liste
		# on obtiendra la longueur de la phrase;
		my $longueur = scalar(keys %dicotmp);
		for (my $i=1;$i<= $longueur; $i++)
		{
			my @LISTE = @{$dicotmp{$i}}; # déréférencer la liste. on pourrait écrire cela en deux lignes :
			# my $LISTE = $dicotmp{$i}; # chercher la valeur
			# my @LISTEdereferencee = @$LISTE; 
			my $mot = $LISTE[0];
			my $pos = $LISTE[2];
			$phrase = $phrase.$mot."/".$pos." ";
		};
		#print $phrase, "\n";
		foreach my $patron (@TERMINO) {
			my $patron2=$patron;
			chomp $patron2;
			$patron2 =~ s/([^ ]+)/\[\^ \]\+\/\\b$1/g;
			#print "<$patron2> est-il présent dans <$phrase>\n";
			
			# 20190403 solution
			#while ($phrase =~ /($patron2)/g) {
			while ($phrase =~ /(?=\s($patron2))/g) {
				#print "$patron2 : $1\n";
				my $terme=$1;
				$terme=~s/\/[^ ]+//g;
				#print $terme,"\n";
				#my $rep=<STDIN>;
				$dicoPatron{$patron}->{$terme}++;
				$nbTerme++;
			}
		}		
		# on réinitialise le dico et la phrase
		%dicotmp = ();
		#$phrasetmp="";
	}
}
close($fileT);

open my $fileResu,">>:encoding(UTF-8)","bao3_sortie_patrons.txt";
print $fileResu "$nbTerme éléments trouvés\n";
foreach my $patron (keys %dicoPatron) {
	print $fileResu "\nType de pattern: ".$patron." \n";
	foreach my $terme (sort {$dicoPatron{$patron}->{$b} <=> $dicoPatron{$patron}->{$a} } keys %{$dicoPatron{$patron}}) {
		print $fileResu $dicoPatron{$patron}->{$terme}."\t".$terme."\n";
	}
}
close($fileResu);