Programmation perl

audrey -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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.

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. Audrey
     
    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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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