Programmation perl

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. Modérateur
    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.
    1. 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.
      1. Modérateur
        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
        1. Modérateur
          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