#!/usr/bin/perl

# script qui affiche les nombres d'occurences des variables d'un fichier perl, en ordre croissant
$fichier_texte = shift;
chomp $fichier_texte;
open(TEXT, "<$fichier_texte");

while (<TEXT>) {
	if (/\s*#/) {
		# c'est du commentaire
	} else {
		# c'est du code
		while (/[\$@%]\w+/) {
		# tant que la ligne contient une variable (des 3 catégories)
		# examiner la première, la traiter et la supprimer
		# la première : entre le début de ligne "^" et ce qu'on cherche "\$\w+\["
		# il n'y que des caractères qui ne sont ni "$", ni "@", ni "%" : "[^\$@%]*"
			if (/^[^\$@%]*\$\w+\[/) {
			# si c'est une composante d'un vecteur
				s/[^\$@%]*(\$\w+)\[//;
				# supprimer la variable, et tout ce qui précède
			} elsif (/^[^\$@%]*\$\w+\{/) {
			# si c'est une valeur d'un hash
				s/[^\$@%]*(\$\w+\{)//;
				# supprimer la variable, et tout ce qui précède
			} elsif (/^[^\$@%]*\$/) {
			# si une variable scalaire 
				s/[^\$@%]*(\$\w+)//;
				# supprimer la variable, et tout ce qui précède
				$var = $1;
				# récupérer la variable, qui avait été mise entre () dans le s///;
				$vars_scal{$var}++;
				# incrémenter le hash %$vars pour la variable
			} elsif (/^[^\$@%]*\@/) {
			# si c'est un vecteur
				s/[^\$@%]*(\@\w+)//;
				# supprimer la variable, et tout ce qui précède
			} elsif (/^[^\$@%]*\%/) {
			# si c'est un hash
				s/[^\$@%]*(\%\w+)//;
				# supprimer la variable, et tout ce qui précède
			}

		}
	}
}
print "Le fichier \"$fichier_texte\" contient : \n\"Nombre d'occurences\" : \"Variable scalaire\"\n";

foreach (sort keys %vars_scal) {
	 push (@occurences, "$vars_scal{$_}\t: $_\n");
	# mettre les lignes d'affichage dans le vecteur @occurences
}

foreach (sort {$a <=> $b} @occurences) {
# trier en odre croissant (des nombres d'occurences) pour l'affichage
# l'option {$a <=> $b} fait que le tri (sort) se fait en ordre numérique
# au lieu de l'ordre lexical (alphabétique), qui est le tri par défaut
	 print;
}
