#!/usr/bin/perl
use utf8;
use Time::HiRes qw(gettimeofday tv_interval);
#-----------------------------------------------------------
<<DOC; 
Votre Nom : Trang LAM
 Février 2019
 usage : perl fichier_programme.pl fichier_talismane.txt fichier_patron 
 Le programme prend en entrée 2 arguments:
 1er argument: le fichier TXT étiqueté par Talismane (Sortie de BàO2)
 2ème argument: fichier_patron 
 Le programme construit en sortie 1 fichier TXT qui contient des patrons syntaxiques triés par ordre de fréquence d'occurrence 
DOC
#-----------------------------------------------------------
my $timepg = [gettimeofday];
my $filetalismane=$ARGV[0];
my $filetermino=$ARGV[1];
#OUverture des fichiers (talismane+patron) en lecture
open my $fileT,"<:encoding(UTF-8)",$filetalismane;
open my $fileTer,"<:encoding(UTF-8)",$filetermino;
#stocker les patrons dans une liste 
my @TERMINO=<$fileTer>,
close $fileTer;
my %dicotmp=();
my %dicoPatron=();
my $nbTerme=0;
my $nbMotInPhrase=0;  

while (my $ligne=<$fileT>) {
	#ignorer les lignes commencent par ## ou par "1	££ ou des lignes vides 
	next if (($ligne=~/^1\t££/) or ($ligne=~/^\#\#/) or ($ligne=~/^$/));
	# !~ équivaut à =~ suivi d'une négation de l'expression
	#Les instructions sont exécutées si $ligne ne commence pas par "chiffre	."
	if ($ligne!~/^\d+\t\./) {
		$ligne=~/^\d+\t(.+)$/;
		#my $cle=$1;
		my $reste=$1;  
		$nbMotInPhrase++; 
		my $cle=$nbMotInPhrase;
		my @listereste=split(/\t/,$reste);
		$dicotmp{$cle}=\@listereste;
	}
	#si $ligne commence par "chiffre ." qui correspond à la fin de la phrase 
	else {
		#------------------------
		# extraction termino....
		my $phrase=" ";
		my $longueur = scalar (keys %dicotmp);
		for (my $i=1;$i<=$longueur;$i++) {
			my $LISTE=$dicotmp{$i};
			my @listedeferencee = @$LISTE;
			my $mot=$listedeferencee[0];
			my $pos=$listedeferencee[2];
			$phrase=$phrase.$mot."/".$pos." ";
		}
		foreach my $patron (@TERMINO) {
			my $patron2=$patron;
			chomp($patron2);
			$patron2=~s/([^ ]+)/\[\^ \]\+\/\\b$1/g;
			#print $patron2,"\n";
			#print $phrase,"\n";
			#my $rep=<STDIN>;
			#IMPORTANT: ?= une assertion de regard en avant. 
			while ($phrase=~/(?=\s($patron2))/g) { 
				my $terme=$1;
				#print $terme,"\n";
				$terme=~s/\/[^ ]+//g;
				#print "$terme\n";
				#my $rep=<STDIN>;
				$dicoPatron{$patron}->{$terme}++;
				$nbTerme++;
			}
		}
		%dicotmp=();
		$nbMotInPhrase=0;
	}
}
close($fileT);

open my $fileResu,">:encoding(UTF-8)","resultat-$filetalismane";
print $fileResu "$nbTerme éléments trouvés\n";
foreach my $patron (keys %dicoPatron) {
	print $fileResu "\nType de pattern: ".$patron." \n\n";
	foreach my $terme (sort {$dicoPatron{$patron}->{$b} <=> $dicoPatron{$patron}->{$a} } keys %{$dicoPatron{$patron}}) {
		print $fileResu $dicoPatron{$patron}->{$terme}."\t".$terme."\n";
	}
}
print $fileResu "\nScript execution time: " . tv_interval($timepg) . " seconds.";
close($fileResu);
