#!/usr/bin/perl

################################################################################
#	Lit le fichier SEGMENTE en phrases (une phrase par ligne passé en argument) 
# 	des calcules divers 
################################################################################

open(FIC, $ARGV[0]);
open(RAPPORT,">Rapport_StatsPhMot_$ARGV[0]");

############## Declarations ####################################################

$i = 0;		#compteur de phrases
$iV = 0;	#compteur de phrases vides
@ph = ();	#contient les phrases du fichier
@phlong = (); 	#contient les longuers des phrases en caracters sans LF

$j = 0;         #compteur de mots dans phrase
@phnbmot = ();  #contient le nombre des mots par phrases`

$k = 0;		#compteur de mots dans fichier entier
@mots = (); 	#contient les mots du fichiers
@motslong = ();	#contient les longuers des mots en caractàres

@slova = (); 	#tableau temporaire pour les mots de la phrase splitée

################ Lecture du fichier et Acquisition des tableaux ################

foreach $ligne(<FIC>)				#LECTURE DU FICHIER LIGNE PAR LIGNE
{
	@slova = ();				#vider la liste de mots tampon
	$j = 0;					#initialiser le compteur de mots dans la phrase
	
	if($ligne !~ /^$/)			#si la ligne lue n'est pas vide
	{
		$ph[$i] = $ligne;		#tableau de phrases
		chomp $ligne;			#enlever le car de la fin de ligne
		$phlong[$i] = length($ligne);	#stocker la longuer de phrases sans LF
		&Separate;			#appel du subprog Separate
		@slova = split(/\s/,$ligne);	#créer un tableau de mots à partir de la ligne
		foreach (@slova)		#inserer les mots de la phrase dans la listemots (linéaire)
		{
			$mots[$k] = $_;
			$motslong[$k] = length($_);
			$k++;			#nb de mots dans le fichier
			$j++;			#nb de mots dans la phrase
		}
		$phnbmot[$i] = $j; 		#nb de mots de la phrase
		$i++;				#compteur de phrases
	}
	else
	{
		$iV++; 	#compteur des lignes vides
	}
}
################ Imprimmer le rapport ##########################################

print RAPPORT "Fichier :  $ARGV[0] \n\n";

print RAPPORT "_______________ Statistiques phrase __________________\n\n";

print RAPPORT "Nombre de phrases : $i\n";
print RAPPORT "Nombre de lignes vides : $iV\n";

@phRES = &TrouveMaxNum(@phlong);
print RAPPORT "Longueur moyenne d'une phrase : $phRES[2] caractères\n" ;
print RAPPORT "Phrase la plus longue en caractères ($phRES[0] caractères) : \n\t$ph[$phRES[1]]\n";

@nbmotRES = &TrouveMaxNum(@phnbmot);
print RAPPORT "Nombre moyen de mots dans une phrase : $nbmotRES[2]\n";
print RAPPORT "Phrase la plus longue en mots ($nbmotRES[0] mots) : \n\t$ph[$nbmotRES[1]]\n";

print RAPPORT "________________ Statistiques mot ____________________\n\n";

print RAPPORT "Nombre de mots : $k\n";

@motsRES = &TrouveMaxNum(@motslong);
print RAPPORT "Longuer moyenne d'un mot : $motsRES[2] caractères\n";
print RAPPORT "Mot le plus long ($motsRES[0] caractères) : \n\t$mots[$motsRES[1]]\n";


################################################################################
close(FIC);
close(RAPPORT);
################################################################################


# SOUS-PROGRAMMES ##############################################################

################################################################################
#	Recherche l'élément le plus grand dans un tableau de nombre et
#	renvoi un tableau avec sa valeur [0] , son indexe  [1], la valeur moyenne
#	d'un élément [2] et le nombre d'éléments du tableau [3].  
################################################################################

sub TrouveMaxNum
{	
	my $i = 0;
	my $max = 0;
	my ($imax, $total, $moyenne, $el);
	
        foreach $el(@_) #lit le tableau passé en paramètre de la fonction
	{
		if ($max < $el)
		{
		    $max = $el ;
		    $imax = $i;
		}
		
		$i++;
		
		$total += $el; ##additionne toute les valeurs pour le calcul de la moyenne
        }
	
	$moyenne = $total / $i;

        return ($max, $imax, $moyenne, $i);
}

################################################################################
#	enlève la ponctuation
#	et remplace tout par espace pour une segmentation en mots graphiques	
################################################################################

sub Separate
{
	$ligne =~ s/\.//g;  #point par rien
	$ligne =~ s/,//g;   #point virgule par rien
	$ligne =~ s/;//g;   #virgule par rien
	$ligne =~ s/://g;   #virgule par rien
	$ligne =~ s/!//g;  
	$ligne =~ s/\?//g;
	
	$ligne =~ s/'/ /g;  #apostrophe par espace
	$ligne =~ s/"//g;   #quotes 
	$ligne =~ s/»//g;   #apostrophe 
	$ligne =~ s/«//g;   #apostrophe
	$ligne =~ s/«//g;   #apostrophe
	$ligne =~ s/«//g;   #apostrophe
	
	$ligne =~ s/\(//g;   
	$ligne =~ s/\)//g;   
	$ligne =~ s/\[//g;   
	$ligne =~ s/\]//g;   
	$ligne =~ s/\{//g;   
	$ligne =~ s/\}//g;   
	 
	$ligne =~ s/-t-/ /g;   
	$ligne =~ s/-/ /g;
	
	$ligne =~ s/  / /g; #deux espaces remplacé par 1  	 
}