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";
#!/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"; }
#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.
#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.
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