#!/usr/bin/perl
#On affecte le contenu de la variable $ARGV[0] (Correspond au premier élément contenu dans le tableau @ARGV, c'est à dire au premier paramètre qui se trouve sur la ligne de commande) à la variable $fichier
$fichier=$ARGV[0];
#On supprime le dernier caractère contenu dans la variable $fichier seulement si celui-ci est un retour à la ligne
chomp ($fichier);
#Si la condition entre parenthèse n'est pas réalisée, on exécute le bloc d'instructions
#L'option -f permet de tester l'existance du fichier dont le nom est contenu dans la variable $fichier
unless (-f $fichier) {
	#On affiche "Le fichier $fichier n'existe pas."
	#On retourne à la ligne
	print "Le fichier \033[32m",$fichier,"\033[00m n'existe pas.\n";
}
#
else {
	#On affiche "Saisissez le mot a chercher : "
	print "Saisissez le mot a chercher : ";
	#On affecte à la variable $mot le contenu de l'entrée standard <STDIN> (Pointeur qui permet de lire le flux d'entrée au clavier)
	$mot=<STDIN>;
	#On supprime le dernier caractère contenu dans la variable $mot seulement si celui-ci est un retour à la ligne
	chomp ($mot);
	#Si le contenu de la variable $mot est égal à rien, on exécute le bloc d'instructions
	if ($mot eq "") {
		#On ouvre en lecture le fichier dont le nom est contenu dans la variable $fichier et on le référence sous le nom FICHIERENTREE
		open(FICHIERENTREE, "$fichier");
		#Tant qu'on peut associer une ligne du fichier référencé sous le nom FICHIERENTREE à la variable $ligne, on exécute le bloc d'instructions
		while ($ligne=<FICHIERENTREE>) {
			#On met en minuscule tous les caractères contenus dans la variable $ligne
			$ligne=lc($ligne);
			#On supprime le dernier caractère contenu dans la variable $ligne seulement si celui-ci est un retour à la ligne
			chomp $ligne;
			#On remplace les caractères inutiles par un dièse
			$ligne=~s/[ ,.;:!?()`"-\<\>]/#/g;
			#On remplace les a accentués par des a inaccentués
			$ligne=~s/[àâä]/a/g;
			#On remplace les e accentués par des e inaccentués
			$ligne=~s/[éèêë]/e/g;
			#On remplace les i accentués par des i inaccentués
			$ligne=~s/[îï]/i/g;
			#On remplace les o accentués par des o inaccentués
			$ligne=~s/[ôö]/o/g;
			#On remplace les u accentués par des u inaccentués
			$ligne=~s/[ùûü]/u/g;
			#Si le contenu de la variable $ligne contient une apostrophe précédée d'un mot ne dépassant pas deux lettres (Comme pour qu'en, l'envi, d'odeurs, ...), on exécute le bloc d'instructions
			if ($ligne=~/#[a-zA-Z]{1,2}'/) {
				#On remplace l'apostrophe par un dièse
				$ligne=~s/'/#/g;
			}
			#On ajoute, à la suite du contenu de la variable $texte, le contenu de la variable $ligne et on ajoute un dièse
			$texte=$texte.$ligne."#";
		}
		#On remplace les dièses qui sont les uns à la suite des autres (Exemple : le##petit###chien) par un seul dièse (Exemple : le#petit#chien)
		$texte=~s/#(#)*/#/g;
		#On supprime le dernier caractère contenu dans la variable $texte seulement si celui-ci est un retour à la ligne
		chomp $texte;
		#On sépare (Le séparateur étant le caractère dièse) la chaîne de caractères contenue dans la variable $texte en plusieurs éléments qu'on affecte au tableau @mots
		@mots=split(/#/,$texte);
		#Pour chaque élément du tableau @mots qu'on affecte à la variable $word, on exécute le bloc d'instructions
		foreach $word (@mots) {
			#Si le contenu de la variable $word n'est pas vide, on exécute le bloc d'instructions
			if ($word ne "") {
				#Si le contenu de la variable $word existe dans le tableau $dicomots, on exécute le bloc d'instructions
				if (exists($dicomots{$word})) {
					#On incrémente la valeur de la clé $word du tableau $dicomots
					$dicomots{$word}++;
				}
				#Sinon (Donc si le contenu de la variable $word n'existe pas dans le tableau $dicomots), on exécute le bloc d'instructions
				else {
					#On affecte la valeur 1 à la valeur de la clé $word du tableau $dicomots
					$dicomots{$word}=1;
				}
			}
		}
		#On trie les valeurs du tableau associatif %dicomots par ordre décroissant et on affecte le résultat dans un nouveau tableau @dicooccurences
		@dicooccurences=sort{$dicomots{$b}<=>$dicomots{$a}}(keys %dicomots);
		#Pour chaque élément du tableau @dicooccurences qu'on affecte à la variable $word, on exécute le bloc d'instructions
		foreach $word (@dicooccurences) {
			#On affiche le contenu de la variable $word, suivi d'une tabulation, suivi du contenu de la variable $word dans le tableau $dicomots
			#On retourne à la ligne
			print $word,"\t",$dicomots{$word},"\n";
		}
	}
	#Sinon si la condition n'est pas remplie, on exécute le bloc d'instructions
	else {
		#On ouvre en lecture le fichier dont le nom est contenu dans la variable $fichier et on le référence sous le nom FICHIERENTREE
		open(FICHIERENTREE, "$fichier");
		#On crée un compteur $compteur et on l'initialise à 0
		$compteur=0;
		#On crée un compteur $compteurlignes et on l'initialise à 0
		$compteurlignes=0;
		#On crée un compteur $compteurmots et on l'initialise à 0
		$compteurmots=0;
		#Tant qu'on peut associer une ligne du fichier référencé sous le nom FICHIERENTREE à la variable $ligne, on exécute le bloc d'instructions
		while ($ligne=<FICHIERENTREE>) {
			#On incrémente le compteur $compteur
			++$compteur;
			#On remplace les a accentués par des a inaccentués
			$ligne=~s/[àâä]/a/g;
			#On remplace les e accentués par des e inaccentués
			$ligne=~s/[éèêë]/e/g;
			#On remplace les i accentués par des i inaccentués
			$ligne=~s/[îï]/i/g;
			#On remplace les o accentués par des o inaccentués
			$ligne=~s/[ôö]/o/g;
			#On remplace les u accentués par des u inaccentués
			$ligne=~s/[ùûü]/u/g;
			#Pour chaque ligne contenue dans la variable $ligne qui contient le mot contenu dans la variable $mot, on exécute le bloc d'instructions
			foreach ($ligne=~/\b$mot\b/i) {
				#On incrémente le compteur $compteurlignes
				++$compteurlignes;
				#On affiche un espace, suivi du contenu de la variable $compteur et suivi d'une tabulation
				print " ",$compteur,"\t";
				#On supprime le dernier caractère contenu dans la variable $ligne seulement si celui-ci est un retour à la ligne
				chomp ($ligne);
				#On sépare (Grâce aux espaces) les mots contenus dans la variable $ligne et on les affecte au tableau @mots
				@mots=split(/ /,$ligne);
				#Pour chaque élément du tableau @mots qu'on affecte à la variable $word, on exécute le bloc d'instructions
				foreach $word (@mots) {
					#Si le contenu de la variable $word contient le mot contenu dans la variable $mot, on exécute le bloc d'instructions
					if ($word=~/\b$mot\b/i) {
						#On incrémente le compteur $compteurmots
						++$compteurmots;
						#On affecte à la variable $m le mot recherché (Contenu dans la variable $&) qu'on colore en rouge
						$m="\033[31m".$&."\033[00m";
						#On affecte à la variable $gauche la chaîne de caractères qui se trouve à gauche du mot recherché (Contenu dans la variable $`)
						$gauche=$`;
						#On affecte à la variable $droite la chaîne de caractères qui se trouve à droite du mot recherché (Contenu dans la variable $')
						$droite=$';
						#On affiche le contenu de la variable $gauche, suivi du contenu de la variable $m, suivi du contenu de la variable $droite et suivi d'un espace
						print $gauche.$m.$droite." ";
					}
					#Sinon si la condition n'est pas remplie, on exécute le bloc d'instructions
					else {
						#On affiche le contenu de la variable $word suivi d'un espace
						print $word." ";
					}
				}
				#On retourne à la ligne
				print "\n";
			}
		}
		#Si le contenu de la variable $compteurmots est égal à 0, on exécute le bloc d'instructions
		if ($compteurmots==0) {
			#On retourne à la ligne
			#On affiche "Le mot ", suivi en rouge du contenu de la variable $mot, suivi de " n'a pas ete trouve dans le fichier ", suivi en vert du contenu de la variable $fichier et suivi d'un point
			#On retourne à la ligne
			#On retourne à la ligne
			print "\nLe mot \033[31m",$mot,"\033[00m n'a pas ete trouve dans le fichier \033[32m",$fichier,"\033[00m.\n\n";
		}
		#Sinon si la condition n'est pas remplie, on exécute le bloc d'instructions
		else {
			#On retourne à la ligne
			#On affiche "Le mot ", suivi en rouge du contenu de la variable $mot, suivi de " est present ", suivi en bleu du contenu de la variable $compteurmots et de " fois", suivi de " dans ", suivi en bleu du contenu de la variable $compteurlignes et de " lignes", suivi de " du fichier ", suivi en vert du contenu de la variable $fichier  et suivi d'un point
			#On retourne à la ligne
			#On retourne à la ligne
			print "\nLe mot \033[31m",$mot,"\033[00m est present \033[34m",$compteurmots," fois\033[00m dans \033[34m",$compteurlignes," lignes\033[00m du fichier \033[32m",$fichier,"\033[00m.\n\n";
		}
	}
}
#On ferme le fichier référencé sous le nom FICHIERENTREE
close(FICHIERENTREE);