Programmation perl

Fermé
audrey - 2 déc. 2011 à 10:56
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 3 déc. 2011 à 17:09
Bonjour,

Voila, j'ai un problème avec mon programme :

while (<>) {
chomp;
$verbe = $_;
if ($verbe =~ /(.*)(e)(l|t)er$/) {
$verbe = $1.$2.$3;
$verbbe = $1.$2.$3.$3;
}

$inf = "er" ;
$jelle = "e" ;
$tu = "es" ;
$nous = "ons" ;
$vous = "ez" ;
$ils = "ent" ;
$jeps = "ai" ;
$tups = "as" ;
$ilps = "a" ;
$nousps = "ames" ;
$vousps = "ates" ;
$ilsps = "erent" ;
$jetuimp = "ais" ;
$ilimp = "ait" ;
$nousimp = "ions" ;
$vousimp = "iez" ;
$ilsimp = "aient" ;
$futur = "er" ;
$nousfu = "erons" ;
$vousfu = "erez" ;
$ilsfu = "eront" ;



print " Verbe : $verbe$inf \n
Indicatif Present\n
=================\n
je $verbbe$jelle \n
tu $verbbe$tu \n
il/elle $verbbe$jelle \n
nous $verbe$nous \n
vous $verbe$vous \n
ils/elles $verbbe$ils \n
\n
Indicatif Passe simple\n
=================\n
je $verbe$jeps \n
tu $verbe$tups \n
il/elle $verbe$ilps \n
nous $verbe$nousps \n
vous $verbe$vousps \n
ils/elles $verbe$ilsps \n
\n
Indicatif imparfait \n
================= \n
je $verbe$jetuimp \n
tu $verbe$jetuimp \n
il/elle $verbe$ilimp \n
nous $verbe$nousimp \n
vous $verbe$vousimp \n
ils/elles $verbe$ilsimp \n
\n
Indicatif futur \n
================= \n
je $verbbe$futur$jeps \n
tu $verbbe$futur$tups \n
il/elle $verbbe$futur$ilps \n
nous $verbbe$nousfu \n
vous $verbbe$vousfu \n
ils/elles $verbbe$ilsfu \n
\n
Conditionnel Present \n
================= \n
je $verbbe$futur$jetuimp \n
tu $verbbe$futur$jetuimp \n
il $verbbe$futur$ilimp \n
nous $verbbe$futur$nousimp \n
vous $verbbe$futur$vousimp \n
ils $verbbe$futur$ilsimp \n
\n
Subjonctif Present \n
================= \n
que je $verbbe$jelle \n
que tu $verbbe$tu \n
qu'il $verbbe$jelle \n
que nous $verbe$nousimp \n
que vous $verbe$vousimp \n
qu'ils $verbbe$ils \n
\n
";
}


C'est un programme qui sert à conjuguer des verbes en 'e(.)er' du 1er groupe aux temps simples. Je dois le modifier pour qu'il rejette les verbes du 1er groupe qui ne sont pas en e(.)er ainsi qu'une liste de verbe en e(.)er qui ne respecte pas le doublement de consonne...

Je suis convaincue qu'il faut utiliser la fonction else (else ($verbe =~ ^[/(.*)(e)(l|t)er$/[) {print"$verbe ne correspond # cette conjugaison. \n ;)
Mais j'ai beau essayer cela ne fonctionne pas.

Je vous remercie d'ores et déjà pour votre aide.
Audrey.
A voir également:

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 déc. 2011 à 11:18
Salut,

Peux-tu donner un exemple d'exécution de ton script avec les deux cas (verbe qui correspond et qui ne correspond pas à tes critères)?

Ce que tu as presenté c'est le script complet ou juste un partie?

Merci.
0
Alors c'est le script complet mais provisoire car je travaille dessus. Des verbes comme jeter ou appeler doivent fonctionner ; sinon je dois exclure tout ce qui ne se termine pas par e(.)er et qui est du 1er groupe quand même comme chanter, parler, etc. Et également une liste d'une vingtaine de verbe qui se termine comme jeter mais qui ne fonctionne pas pareil (ex : geler, céder,...).

J'espère que ce que je dis n'est pas trop confus. En tout cas merci pour votre aide !
Audrey.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 3/12/2011 à 12:35
Salut,

Oui c'est confus puisque pour la construction de la regex il faut savoir précisément les critères de reconnaissance.

Si tu veux seulement les verbes en e(.)er pas de problèmes mais céder fait parti de verbes du 1er groupe qui se terminent en é(.)er.

chanter je veux bien (non je ne suis pas chanteur ;-) mais dans ce cas si je ne me trompe c'est un verbe de 1er group en er.

Concernant les critères de vérification du choix du verbe
Voici les critères j'espère que je n'ai rien oublié.
Dit moi les critères que tu dois tester.

1.      -er  
2.      -cer  
3.      -ger  
4.      -e(.)er  
5.      -é(.)er  
6.      -eler - qui double le l devant un e muet  
7.      -eter - qui double le t devant un e muet  
8.      -eler - qui change le e en é devant une syllabe muette  
9.      -eter - qui change le e en é devant une syllabe muette  
10.     -éer  
11.     -éger  
12.     -ier  
13.     -ayer  
14.     -oyer  
15.     -uyer


Concernant le code

- L'opérateur <> lit soit depuis l'entrée standard soit depuis les fichiers passer en argument dans la ligne de commande.
Le tableau @ARGV sera lu en 1er et il contient éventuellement une liste des noms de fichiers à traiter.
- Inviter écrire sur l'entrée standard sans invitation ce plutôt confus comme ma phrase d'ailleurs. Il faudrait faire comprendre à l'utilisateur que fait ce programme sinon il va l'exécuter\ et ensuite il va attendre sans savoir quoi attendre

Exemple mauvais
lami20j@debian-acer:~/perl$ cat ex.pl   
#!/usr/bin/perl  
use strict;use warnings;  
while(<>){  
  print "On attends quelque chose, ben rien, trop tard ;-(\n";  
}  
__END__  

lami20j@debian-acer:~/perl$ perl ex.pl   


En ce moment l'utilisateur attends et quand il voit que rien ne se passe peut être il va appuyer sur la touche Entrée une fois et il va avoir ça

lami20j@debian-acer:~/perl$ perl ex.pl   

On attends quelque chose, ben rien, trop tard ;-(  


Toujours rien et il va faire encore une fois et encore une fois (nombre de fois proportionnels avec sa patience et il finira par dire que c'est un programme de m**** ;-)

lami20j@debian-acer:~/perl$ perl ex.pl   

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  


Alors il va poser la question sur CCM pour demander comment on arrête ce programme et on lui dira qu'il faut faire CTRL-C par exemple (voir en gras) ;-)))
Quand on tape CTRL-C c'est possible de voir ^C sur l'écran.

lami20j@debian-acer:~/perl$ perl ex.pl   

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  

On attends quelque chose, ben rien, trop tard ;-(  
^C


Exemple lisible
Un programme doit être intuitif.
L'utilisateur doit être aider pour qu'il sache à quoi sers le programme sinon il va s'énerver et tu auras une mauvaise moyenne.

lami20j@debian-acer:~/perl$ cat ex.pl   
#!/usr/bin/perl  
use strict;use warnings;  
my $reponse;  

do{  
  print "Entre un verbe du 1er groupe : ";  
  chomp (my $verbe = <STDIN>);  
  print "Vous avez écrit $verbe. Voulez vous continuer [Oui/Non] ? ";  
  chomp($reponse = <STDIN>);  
}while($reponse eq "Oui")  
__END__  

lami20j@debian-acer:~/perl$ perl ex.pl   
Entre un verbe du 1er groupe : aimer  
Vous avez écrit aimer. Voulez vous continuer [Oui/Non] ? Oui  
Entre un verbe du 1er groupe : parler  
Vous avez écrit parler. Voulez vous continuer [Oui/Non] ? Non  
lami20j@debian-acer:~/perl$ 




lami20j
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 3/12/2011 à 17:23
Voici un exemple pour t'inspirer
lami20j@debian-acer:~/perl$ cat verbe_fr_1er_groupe.pl  
#!/usr/bin/perl 
use strict;use warnings; 

my $reponse; 
# objets regex verbe en -er 

my $cer  = qr/cer$/; 
my $ger  = qr/[^é]ger$/; 
my $e_er = qr/e[^lt]er$/; 
my $e_er_= qr/é[^g]er$/; 
my $eler = qr/eler$/; 
my $eter = qr/eter$/; 
my $eer  = qr/éer$/; 
my $eger = qr/éger$/; 
my $ier  = qr/ier$/; 
my $ayer = qr/ayer$/; 
my $oyer = qr/oyer$/; 
my $uyer = qr/uyer$/; 

my $er=qr/.*(?!(?:$cer|$ger|$e_er|$e_er_|$eler|$eter|$eer|$eger|$ier|$ayer|$oyer|$uyer))er$/i; 

print $er,"\n"; # juste pour voir à quoi rassemble la regex 
                # pour tous les autre cas 


do{ 
  print "Entre un verbe du 1er groupe : "; 
  chomp (my $verbe = <STDIN>); 

SWITCH:{ 
  $verbe =~ $cer   && do { print "$verbe en -cer\n";   last SWITCH; }; 
  $verbe =~ $ger   && do { print "$verbe en -ger\n";   last SWITCH; }; 
  $verbe =~ $e_er  && do { print "$verbe en -e(.)er\n";last SWITCH; }; 
  $verbe =~ $e_er_ && do { print "$verbe en -é(.)er\n";last SWITCH; }; 
  $verbe =~ $eler  && do { print "$verbe en -eler\n";  last SWITCH; }; 
  $verbe =~ $eter  && do { print "$verbe en -eter\n";  last SWITCH; }; 
  $verbe =~ $eer   && do { print "$verbe en -éer\n";   last SWITCH; }; 
  $verbe =~ $eger  && do { print "$verbe en -éger\n";  last SWITCH; }; 
  $verbe =~ $ier   && do { print "$verbe en -ier\n";   last SWITCH; }; 
  $verbe =~ $ayer  && do { print "$verbe en -ayer\n";  last SWITCH; }; 
  $verbe =~ $oyer  && do { print "$verbe en -oyer\n";  last SWITCH; }; 
  $verbe =~ $uyer  && do { print "$verbe en -uer\n";   last SWITCH; }; 
  $verbe =~ $er    && do { print "$verbe en -er\n";    last SWITCH; }; 
  my $rien=1 && print "$verbe n'appartient pas à la 1ère groupe.\n"; 
} 
print "Voulez vous continuer [Oui/Non] ? "; 
chomp($reponse = <STDIN>); 
}while($reponse eq "Oui") 
__END__



Exécution du script
lami20j@debian-acer:~/perl$ perl verbe_fr_1er_groupe.pl  
(?^i:.*(?!(?:(?^:cer$)|(?^:[^é]ger$)|(?^:e[^lt]er$)|(?^:é[^g]er$)|(?^:eler$)|(?^:eter$)|(?^:éer$)|(?^:éger$)|(?^:ier$)|(?^:ayer$)|(?^:oyer$)|(?^:uyer$)))er$) 
Entre un verbe du 1er groupe : aimer 
aimer en -er 
Voulez vous continuer [Oui/Non] ? Oui 
Entre un verbe du 1er groupe : chanter 
chanter en -er 
Voulez vous continuer [Oui/Non] ? Oui 
Entre un verbe du 1er groupe : manger 
manger en -ger 
Voulez vous continuer [Oui/Non] ? Oui 
Entre un verbe du 1er groupe : assièger 
assiéger en -éger 
Voulez vous continuer [Oui/Non] ? Oui 
Entre un verbe du 1er groupe : courrir 
courrir n'appartient pas à la 1ère groupe. 
Voulez vous continuer [Oui/Non] ? Non


lami20j
0