Localisation des motifs (localisation.pl)

Voici un petit texte débile, qu'on pourra améliorer à son gout. On demande d'écrire les motifs, puis de tester, pour chercher :

#!/usr/bin/perl -w 
$texte="Il y a 2 mois, ce n'est pas toi qui a découvert cette vieille armoire, cachée sous la toiture\n. Moi, je te dis que c'est bien moi, il y a 2 ou 3 mois "; 
$motif=<>; 
chomp($motif); 
print "Recherche de $motif\n";
  1. L'un des mots moi, toi, partout dans le texte

    #!/usr/bin/perl -w
    
    $texte="Il y a 2 mois, ce n'est pas toi qui a decouvert cette vieille armoire, cachee sous la toiture.\n Moi, je te dis que c'est bien moi, il y a 2 ou 3 mois "; 
    
    #On affiche "Motif a chercher : " 
    print "Motif a chercher : "; 
    $motif=<STDIN>; 
    chomp($motif); 
    
    #Si le contenu de la variable $motif est égal à rien, on exécute le bloc d'instructions 
    if ($motif eq "") { 	
    	#CAD qu'on affiche "Vous n'avez pas donne de motif a chercher." 	
    	print "Vous n'avez pas donne de motif a chercher.\n"; 
    } 
    
    #Sinon on exécute le bloc 
    else { 	
    	#On affiche "Recherche du motif ", suivi en bleu sur fond noir du contenu de la variable $motif et suivi de " :" 	
    	print "\nRecherche du motif \033[1;34;40m$motif\033[0m\n"; 	
    	#On sépare les mots contenus dans la variable $texte et on les affecte au tableau @mots 	
    	@mots=split(/ /,$texte); 	
    	#pour chaque élément de @mots qu'on affecte à la variable $mot, on exécute le bloc 	
    		
    		foreach $mot (@mots) { 		
    			
    			#Si le contenu de $mot contient le mot contenu dans $motif, on exécute le bloc 		
    			if ($mot=~/\b$motif\b/i) { 			
    				#On affecte à $mot le motif recherché (dans $&) qu'on colore en bleu sur fond noir(code couleur du shell) 			
    				$mot="\033[1;34;40m".$&."\033[0m"; 			
    				#On affecte à $gauche la chaîne de caractères qui se trouve à gauche du motif recherché(dans $`) 			
    				$gauche=$`; 			
    				#On affecte à $droite la chaîne de caractères qui se trouve à droite du motif recherché(dans $') 			
    				$droite=$';
    				print $gauche.$mot.$droite." "; 		
    			} 			
    
    			#si la condition n'est pas remplie, on exécute le bloc
    			else { 			
    				#On affiche le contenu de la variable $mot suivi d'un espace
    				print $mot." "; 		
    			} 	
    	} 	
    	#On retourne à la ligne 
    	print "\n"; 
    }
    

    Image 15.1

  2. Les sous-chaines moi ou toi.

    #Si le contenu de $mot contient le mot contenu dans $motif, on exécute le bloc 		
    			if ($mot=~/$motif/i) {
    

    Seule cette ligne est à modifier, en effet on ne recherche plus un mot (précédement délimité par l'expression \b) mais un motif peu importe qu'il soit inclus dans un mot, ou un mot lui même.

    Image 15.2

  3. Le mot moi seulement en début de phrase

    #Sinon on exécute le bloc 
    else { 	
    	#On affiche "Recherche du motif ", suivi en bleu sur fond noir du contenu de la variable $motif et suivi de " :" 	
    	print "\nRecherche du motif \033[1;34;40m$motif\033[0m\n"; 	
    	
    			if (($texte=~/[.\n]$motif\b/i)) {
    				#On affecte à $mot le motif recherché (dans $&) qu'on colore en bleu sur fond noir(code couleur du shell) 			
    				$mot="\033[1;34;40m".$&."\033[0m"; 			
    				#On affecte à $gauche la chaîne de caractères qui se trouve à gauche du motif recherché(dans $`) 			
    				$gauche=$`; 			
    				#On affecte à $droite la chaîne de caractères qui se trouve à droite du motif recherché(dans $') 			
    				$droite=$';
    				print $gauche.$tex.$droite." ";
    			} 			
    
    			#si la condition n'est pas remplie, on exécute le bloc
    			else { 			
    				#On affiche le contenu de la variable $mot suivi d'un espace
    				print $texte." ";
    			} 	
    	} 	
    	#On retourne à la ligne 
    	print "\n"; 
    }
    

    Ici on ne cherche plus des mots, mais un motif qui serait en début de phrase. Il faut donc préciser que le motif doit être retenu seulement s'il est précédé d'un point par exemple.

    Image 15.3

  4. Tester la différence entre recherche de mots et de sous-chaines

    La différence entre des mots et des sous-chaînes est que pour des mots on cherche seulement le mot (Par exemple pour moi on ne trouve que moi) alors que pour les sous-chaînes on cherche tous les mots qui contiennent cette séquence de caractères (Par exemple pour moi on trouve moi mais aussi mois armoire ...). D'où la spécification avec les frontières de mot \b pour la recherche de mots, et la non spécification moi la sous-chaine.

Beliao julie 2010-06-07