[Perl] substitutions, expressions régulières et dictionnaire ...

substitutions, expressions régulières et dictionnaire ... [Perl] - Perl - Programmation

Marsh Posté le 23-09-2003 à 10:13:10    

:hello:
 
Je débute en PERL et je dois travailler sur un petit projet (type ELIZA pour ceux qui connaissent) et j'ai un p'tit problème avex le commande de substitution :(
 
voilà ce que je cherches à faire :
 

$maChaine = s/I am/are you/;

(l'idée est de retourner les questions de l'utilisateur)
 
pour me simplifier la tâches, j'ai créé un dico comme ça :
 

inver{'I am'} = 'are you';
inver{'you are'} = 'am I';
...
...
...


 
j'utilise ça de cette façon :
 

$maChaine = s/(I am|you are)/$inver{$1}/;


 
ça fonctionne mais je dois écrire (I am|you are) et la liste s'allonge dramatiquement, je voudrais donc trouver le moyen de donner toutes les clés d'un dictionnaire dans le premier paramètre du s
 
à votre bon coeur :)

Reply

Marsh Posté le 23-09-2003 à 10:13:10   

Reply

Marsh Posté le 23-09-2003 à 10:28:07    

perso je ferais un truc dans ce gout la:

Code :
  1. foreach $cle (keys %inver)
  2.    $maChaine =~ s/$cle/$inver{$cle}/gi;
  3. }


mais tu fais une boucle et si tu as beaucoup de clé ça peut ramer.
Sinon tu peux essayer quelque chose comme ça:

Code :
  1. my $cle = "(". join('|', keys %inver) . " )";
  2. $maChaine =~  s/$cle/$inver{$1}/gi;


Si ya  des trucs que tu comprends pas hesites pas !!!
 

Reply

Marsh Posté le 23-09-2003 à 10:35:06    

vais essayer ça
 
la seconde méthode devrait fonctionner à priori
 
(la première marchera pas trop vu que ça va par exemple me transformer un my en your puis ce même your en my [:joce])

Reply

Marsh Posté le 23-09-2003 à 11:54:19    

des petits trucs qui pourraient t'aider:
 
un clone d'eliza:
http://search.cpan.org/~jnolan/Chatbot-Eliza-1.04/
 
un truc pour faires des regexps rapides à partir de listes:
http://search.cpan.org/author/DANK [...] xp/List.pm
 
un truc pour eviter les problemes des substiutions chainées (tres important pour ton probleme):
http://search.cpan.org/author/LPAL [...] arallel.pm
 
et sinon, au lieu de faire

Code :
  1. inver{'I am'} = 'are you';
  2. inver{'you are'} = 'am I';
  3. ...
  4. ...
  5. ...


tu peu simplement taper:

Code :
  1. %invert = (
  2. 'I am' => 'are you',
  3. 'you are' => 'am I',
  4. );

Reply

Marsh Posté le 24-09-2003 à 11:11:05    

merci beaucoup pour ton aide :)
 
j'ai pas tout utilisé mais vu que le truc était à faire en une semaine, je pense que j'ai qq chose d'acceptable :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed