reconnaissance de plusieurs mots sur une même ligne - Perl - Programmation
Marsh Posté le 23-04-2009 à 02:02:44
Si vous pouviez être plus claire dans ce que vous cherchez a faire, ca nous permettrait de repondre, parce que la...
> lire une ligne entière à perl
perl, ca execute des scripts, alors ce n'est pas tres clair. Faire lire une ligne entiere a un script? Une ligne qui vient d'ou?
> ils parlent souvent du fait que perl cherche toujours l'expression rationnelle le plus tôt possible dans la chaîne, mais nulle part ils ne disent comment contrecarrer ce phénomène.
Expression rationelle?? vous voulez dire expression réguliere je suppose. Au contraire perl cherche le plus grand texte matchant une expression régulière. Mais il y a moyen de lui faire chercher le plus petit texte matchant une expression régulière, c'est dans la doc perl pour les expressions régulieres (on y remplace * par *?, + par +? et ? par ??)
>> de plus sauriez-vous comment on peut faire lire plusieurs textes à la suite pour un même programme??
Tout dépend de comment votre script perl lit un texte.
A+,
Marsh Posté le 23-04-2009 à 03:32:55
alors en fait j'ai un texte qui est lu par perl ligne par ligne, jusque là aucun problème.
ensuite, je fais reconnaitre des scripts dans mon texte. mon problème est que sur une même ligne écrite lorsque perl me reconnait un script si un autre est présent sur cette même ligne, il ne le reconnaitra pas car il va directement à la ligne suivante... et je voudrai éviter cela.
alors, comment faire???
merci
Marsh Posté le 23-04-2009 à 08:37:03
lucie 25 a écrit : alors en fait j'ai un texte qui est lu par perl ligne par ligne, jusque là aucun problème. |
Je suis désolé, mais ce que vous avez écrit ici ne veut rien dire du tout.
Citation : j'ai un texte qui est lu par perl ligne par ligne |
?? Vous avez un texte lu par un script perl? (car je vous le rappelle, perl n'est qu'un moteur a script, ce qui fait le boulot, comme par exemple de lire une ligne, c'est le script).
Ce script est dans un fichier? alors pourquoi ne pas nous le montrer ici? et si c'est juste une ligne de commande, pourquoi ne pas nous la recopier ici?
Le texte lu ligne par ligne, il est dans un fichier je suppose. Comment le script y accède t'il? le nom du fichier est sur la ligne de commande? ou bien le nom du fichier est écrit dans le script perl?
Citation : |
Je suppose qu'ici, vous voulez dire je fais reconnaitre des suites de lettres vérifiant une expression régulière dans mon texte.
Citation : |
Il faut le code de l'expression régulière au minimum ici, pour savoir comment la modifier.
A+,
Marsh Posté le 23-04-2009 à 13:13:25
mon vocabulaire laisse à désirer mais c'est bien ce que vous avez dit.
voici donc mon script à exécuter par perl :
open(FICH,"texte19moutons.txt" ) || die "Impossible d'ouvrir le fichier.";
$cpt = 0;
while(<FICH> )
{
$a = $_;
if(/\bmoutons?\b/)
{
$cpt = $cpt+1;
}
}
print "'moutons' existe dans le fichier.\n";
print "J'ai trouve $cpt occurrences de 'moutons'.\n";
close (FICH);
portant sur ce texte :
les moutons sont méchants.
les moutons sont des moutons blancs.
les moutons noirs ne sont pas des moutons blancs.
Ce texte est sur un fichier séparé du script, dans le dossier bin de perl.
lorsque j'exécute mon script sous commande ms-dos sont reconnues trois des cinq occurrences de "moutons" dans mon texte. et j'ai lu que c'est parce que la reconnaissance d'expressions rationnelles se fait toujours au plus tôt et après le script passe à la ligne suivante. je voudrai donc pouvoir éviter cela et pouvoir compter toutes les occurrences présentes dans mon texte.
merci
Marsh Posté le 23-04-2009 à 13:48:05
merci, votre solution fonctionne très bien.
cependant, pour une recherche de thème dans un texte, je dois tenir compte de plusieurs possibilités, et il me semble que cela ne puisse fonctionner avec while... :
Code :
|
merci de votre aide
édité par Elmoricq : ajout des balises [code] pour plus de lisibilité
Marsh Posté le 23-04-2009 à 14:24:50
tu n'as pas besoin du while si tu n'as pas besoin de compter plus d'une occurence sur la ligne
Marsh Posté le 23-04-2009 à 14:26:44
et bien justement c'est plus ou moins le même problème que pour compter c'est-à-dire que si j'ai plusieurs mots-clés sur une même ligne, il n'en reconnaitra qu'un seul (le premier)...
et je voudrai éviter cela
merci
Marsh Posté le 23-04-2009 à 16:28:55
normalement non si ta regex est bien construite
pour faire des OU logique il faut utiliser un seul pipe "|"
et au pire tu peux faire des boucles while au lieu de ton if
Marsh Posté le 23-04-2009 à 16:38:25
ok
mais comment puis-je savoir si ma regex est bien construite?? je débute totalement...
Marsh Posté le 24-04-2009 à 04:08:07
Une solution parmi d'autres possibles, que j'ai pas mal commenté, puisque tu débutes.
Code :
|
A+,
Marsh Posté le 04-05-2009 à 23:32:52
je te remercie pour ton aide!! malheureusement, cela ne convient pas...
mon but est un peu complexe... mais merci quand même
Marsh Posté le 05-05-2009 à 20:35:25
Et si au lieu de nous dire que ça ne te convient pas, tu nous expliquais ce qui te conviendrait. Ou pourquoi cela ne te convient pas...
Ce serait peut être plus constructif.
A+,
Marsh Posté le 05-05-2009 à 21:50:36
Alors, pour faire simple, mon prof me demande de faire un projet me permettant d'extraire un thème de chaque texte présenté et de faire un résumé automatique de chacun de ces textes. Je me suis restreinte à 11 textes portant sur 5 thèmes.
J'ai donc écrit un script qui permet de faire demander en premier lieu sur quel texte on veut travailler et par la suite faire ouvrir le texte en question il s'agit de mon script principal.
Ensuite, j'ai écrit un sous programme permettant de faire reconnaître mes expressions régulières associées à chacun de mes thèmes. Cependant dans un même texte, plusieurs thèmes peuvent être présent, et j'ai tenté de mettre en place un compteur qui pourrait me permettre d'évaluer la fréquence d'expressions régulières la plus important et ainsi n'en ressortir qu'un seul thème (ce qui, au passage, n'a aboutit) avec un deuxième sous-dossier.
Et pour le moment je n'ai pas osé tenter le résumé automatique.
Voici mon programme :
Code :
|
Le second sous programme n'est pas mis pour être effectué car je ne veux pas qu'il tourne en boucle en l'incluant dans la boucle while, cependant ailleurs il ne fonctionne pas du tout...
Je pense que je me suis compliqué les choses mais je ne vois malheureusement pas comment me simplifier...
merci quand même
Marsh Posté le 06-05-2009 à 18:01:40
Bon, déja, on peut simplifier tout ce qui se passe en dehors de la routine theme:
Code :
|
En particulier, quand on a des routines avec une entrée utilisateur, mieux vaut les traiter a part, afin de boucler tant que l'entrée n'est pas correcte, etc.
Plutôt que de coder en dur 11 cas différents pour vos noms de fichier, il était plus simple de construire le nom du fichier à partir du numéro et d'utiliser un code commun.
A+,
Marsh Posté le 06-05-2009 à 23:07:22
Bon, j'ai regardé la suite du pb.
Voici un exemple que tu peux adapter en fonction de tes besoins. J'ai gardé les thèmes de la précédente fois.
Code :
|
A+,
Marsh Posté le 07-05-2009 à 00:03:54
merci beaucoup, je vais essayer de me faire avec tout ça (bien que par moment je ne comprenne pas tout...)
encore merci
à plus
Marsh Posté le 18-04-2009 à 14:56:13
bonjour,
connaîtriez-vous la façon dont on peut faire lire une ligne entière à perl?
j'ai éclusé toutes mes ressources internet et sur papier, je ne trouve pas de solution.
ils parlent souvent du fait que perl cherche toujours l'expression rationnelle le plus tôt possible dans la chaîne, mais nulle part ils ne disent comment contrecarrer ce phénomène.
si vous pouviez m'éclairer un peu, je vous en serai reconnaissante.
de plus sauriez-vous comment on peut faire lire plusieurs textes à la suite pour un même programme??
à l'avance merci
Message édité par lucie 25 le 18-04-2009 à 14:57:19