#!usr/bin/perl
 
# But du programme : extraire d'un fichier
# Fonctionnement : perl prog fichier_de_treetagger|fichier_de_cordial ==> pour l'utilisation de fichiers cordial on fera attention de :
# a) corriger le fichier motif
# b) de modifier les impressions des colonnes en conséquence
 
use strict;
use warnings;
use Data::Dumper;
use 5.014;
 
die "syntaxe pour programme $0 : perl prog fichierTagger(résultat treetagger) fichierMotif(1 ligne séparée par tabulation) nomSortie" unless (@ARGV==3);
# création d'un dossier de sortie
mkdir ("./RESULTAT_EXTRACTION_MOTIF_PERSO");
# récupération des arguments
my $fichier = shift @ARGV;
my $fichierMotif = shift @ARGV;
my $motifName = shift @ARGV;
#on change un peu le nom de sortie
$motifName =~ s/.txt//g;
#on donne le nom de fichier en cours de traitement
say"_"x20;
say "extraction : $motifName";
#chemin final de sortie
my $fichierSortie = "./RESULTAT_EXTRACTION_MOTIF_PERSO/Result". $motifName;
##say $fichierSortie; 
#ouverture de fichiers entrées/ et du fichier de sortie
open (my $INData, "<", "$fichier") or die "problème ouverture fichier tagger : $!";
open (my $INMotif, "<", "$fichierMotif") or die "problème ouverture fichier motif : $!";
open (my $OUTmotif, ">>", "$fichierSortie") or die "problème ouverture fichier motif : $!";
#découpage et stockage du motif
my @motif =  split /\t/, <$INMotif>;
# sans cette ligne le fichier de motif pose problème, résidu de la fonction split ???
$motif[scalar(@motif) - 1] =~ s/\R//;

# préparation des variables 
my @tag1 =();
my @tag2 =();
my @tag3 =();
my $stock1;
my $stock2;
my $stock3;

#extraction et stockage du fichier issu de treetagger (ou de cordial), et découpe selon les tabulations, stockage dans trois tableaux
foreach (<$INData>)
{
#chomp;
 ($stock1, $stock2, $stock3) = split /\t/, $_;
 push @tag1, $stock1;
 push @tag2, $stock2;
 push @tag3, $stock3;
}
# préparations des compteurs 
my $i=0;
my $j;
#préparation des tableaux pour stocker les résultats 
my @result1 = ();
my @result2 = ();
my @result3 = ();
#on parcourt la liste entière de tag
for ($i = 0; $i < scalar(@tag2); $i++)
{
# on parcourt pour chacun aussi chaque élément du motif 
        for ($j = 0; $j < scalar(@motif); $j++)
        {
		#say ' [', $tag2[$i + $j], '] motif [' , $motif[$j] , "]";
#si le tag est égal au motif on stocke dans le fichier résultat
#l'avantage de cette technique est que comme les indices sont égaux à 0, au premier tour pour le motif (j=0), et donc le tag en court est comparer au premier élément du motif. Au deuxième tour on prend la référence du premier tag et on déplace les indices de 1 on teste donc si tag[reférence+1] == motif[2] ... l'avantage ? Quelque soit la taille du motif on peut tester les indices de 0 à n !
                if ($tag2[$i + $j] eq $motif[$j])
                {
                        push (@result1, $tag1[$i + $j]);
                        push (@result2, $tag2[$i + $j]);
                        push (@result3, $tag3[$i + $j]);
                }
#Si on trouve une faute pendant le parcourt du motif on "reset" les tableaux et on quitte la boucle, on passera à la suite
                else    
                {
                                @result1 = ();
                                @result2 = ();
                                @result3 = ();
                        last; 
                }
# Quand $j est égal au nombre d'éléments du motif, on a réussi, on imprime. Puis on "reset" les tableaux pour tester un nouveau motif jusqu'à la fin du fichier. Si on veut changer un élément d'impression (par exemple pour utiliser un fichier cordial) on change ici les éléments d'impression.
                if ($j == (scalar(@motif) - 1)) 
                {

						
						say $OUTmotif "@result1";
						#print $OUTmotif Dumper (@result1);
						#print $OUTmotif Dumper(@result2);
						#print Dumper(@result3);
						#@result = ();
						@result1 = ();
						@result2 = ();
						@result3 = ();
                }
        }
}
close $OUTmotif; 
close $INData;
close $INMotif;
