Problème avec mon programme perl

Résolu
Bonjour !
Je travaille sous Perl en programmation et j'utilise Crimson Editor pour taper mes scripts....
J'ai un souci avec mon programme au niveau de la variable $trouve et je ne comprends pas pourquoi. Dans le shell, ils me disent bareword "oui" is not allowed... (je sais ce que ca veut dire mais bon ca ne m'aide pas vraiment).
En fait c'est depuis que j'ai intégré la partie avec la variable $trouve que j'ai un souci...(je le mets en italique).
En fait ce que je dois faire c'est ouvrir un fichier (qui sera un dico) et si le mot est dedans soit la traduction de ce mot est donnée soit on l'ajoute dans le dico...

Par contre SVP !!!! la facon dont j'ai l'habitude d'écrire en perl ne ressemble pas vraiment à tout ce que je vois sur le site donc : pas de commandes que je ne connais pas svp...en cas, j vous donnerai ce kj'ai eu en cours...

Voilà ce que j'ai fait jusqu'à présent :

#!usr/bin/perl
use strict;
use warnings;

my $rep;
my $rep2;
my $mot_langue;
my $mot_fr;
my $mot_ang;
my $trad_ang;
my $trad_fr;
my $texte_langue;
my $trouve;
my $ajout2;
my $nomfich;
my $fic_fr;
my $ficdico_fr;
my $ligne;
my $dico_fr;
my $nomfich1;

$nomfich=shift;
$nomfich1=shift;

print ("Voulez-vous traduire un mot, O ou N ?");
$rep=<STDIN>;
chomp $rep;

if ($rep eq "O") {

print ("Voulez-vous traduire un mot francais en anglais, 0 ou N ?");
$rep2=<STDIN>;
chomp $rep2;

if ($rep2 eq "O") {
print ("tapez le mot francais à traduire \n");
$mot_fr=<STDIN>;
chomp $mot_fr;

open $ficdico_fr,'<',"dico_fr.txt" or die "fichier non ouvert!\n";
$trouve=non;

if ($trouve==oui) {
print $trad_ang;
$trad_ang=<STDIN>;
chomp $trad_ang;

}

else {

if ($trouve==non) {
open $ficdico_fr,'>>',"dico_fr.txt" or die "fichier non ouvert!\n";
$ajout2="\n$dico_fr";
print $ficdico_fr $ajout2;
close $ficdico_fr;

open $ficdico_fr,'<',"dico_fr.txt" or die "fichier non ouvert!\n";
print " ";

while ($ligne=<$ficdico_fr>) {
print $ligne;
}
}
}
}

else {
if ($rep2 eq "N") {
print ("tapez le mot anglais à traduire \n");
$mot_ang=<STDIN>;
chomp $mot_ang;
}
}
}

else {
if ($rep eq "N") {
print ("tapez le texte à traduire \n");
$texte_langue=<STDIN>;
chomp $texte_langue;
}
}

Voilà...j'espère que qqun pourra m'aider !!
merci d'avance
Configuration: Windows XP
Internet Explorer 7.0

43 réponses

Résumé de la discussion

Plusieurs éléments montrent que le problème principal réside dans l'intégration de la variable $trouve et des valeurs littérales 'oui' et 'non' lors de la gestion d'un dictionnaire en Perl. La meilleure réponse propose d'abord concevoir un algorithme clair, puis d'écrire le code en suivant une approche structurée, avec une fonction 'dico' qui gère les traductions et les ajouts. Elle suggère également de travailler séparément les directions français/anglais et anglais/français, en utilisant des fichiers distincts et une logique réutilisable pour faciliter les modifications et l'extension. En exemple pratique, la proposition illustre un script de menu et une boucle de traduction qui ajoutent automatiquement un mot inexistant, tout en conservant une architecture prête à être étendue.

Bobot (l’IA à votre service)
  1. coucou je viens de decouvrir que la prof a mis des cours sur le site de la fac...y compris les commandes et les différentes ecritures de code que tu m'as montrées...
    donc je vais te piquer ton ecriture lol pask c clair et net que c largement plus pratique...
    bon il faut que je vois qd mm pour la traduction de texte pask je bloque tjs sur comment extraire de ma ligne la traduction d'unmot...mais bon vu les nouveaux cours que j'ai ca devrait aller je pense...je viens de finir de les lire mais je vais les approfondir...
    et si j'ai u truc que je comprends pas ben j ferai appel a tes bons services ;-)
    0
    1. ben pour le script je n'arrete pas d'essayer...seulement quand je m'y mets j'ai l'esprit qui pense a tellement de choses en mm tps a propos de mon programme et la maniere de le faire que je m'y perds un peu...
      sinon pour ce que tu m'as dit a propos des 2 scripts et tout , oui tkt pas c ce que je fai depuis le debut en changeant juste les variables...
      au fait pour l'ajout des traductions dans les dico je me suis apercue qu'en fait ca marchait !! lol ...donc je suis contente
      et la j bloque toujours sur la traduction de texte ( francais anglais pour le moment...aps je sais k j'aurais juste a copier coller changer les variables...)...je vais essayer de moins m'eparpiller...
      merci pour ton script au fait mais je garde mon ecriture a moi...si je commence a ecrire autrement je ne vais plus m'en sortir...ya pas mal de trucs que je n'ai pas appris et que tu ecris toi (bien que j'aime apprendre de nouvelles choses là n'est pas le souci)...
      bref
      si jms je me perds de nouveau je te fais signe...
      0
      1. Modérateur
        Salut,

        comme je te l'ai dit au début il fallait d'abord faire l'algo de ton cas et ensuite commencer écrire le code
        d'après ton message je vois que tu ne l'as pas fait :-))

        je te conseille une chose
        de travailler au début dans une seule direction
        c'est-à-dire dico français/anglais

        une fois que tu as fini le dico français/anglais et qu'il fonctionne il ne te restera qu'à copier le code et faire les modifications de nom de fichiers
        de toute façon ça sera la même chose avec la seule différence qu'il traitera anglais/français
        c'est pour ça que je te parle d'un algo puisqu'en fait tu auras presque le même code 2 fois
        pense à la programmation structurée dans ton cas

        quand j'ai écrit mon bout de script je voulais tout simplement de ne pas m'eloigner de ton code, mais si j'aurais du faire un tel script je l'aurais fait autrement

        Voici un exemple
        j'ai crée une fonction dico qui fait tout
        si jamais il y a des problèmes il faut juste modifier les variables ou regarder dans la fonction
        c'est plus compact et facile à faire des modifications

        le script
        #!/usr/bin/perl
        use strict;use warnings;
        my $trouve = 0;
        
        print <<"FIN";
        Dictionnaire
        1. français/anglais
        2. anglais/français
        3. quitter
        FIN
        print "Faites votre choix : ";
        chomp (my $rep = <STDIN>);
        
        dico($rep);
        
        sub dico {
            my $choix = shift;
            my ($dir,$dico);
            if ($choix == 3){
              die "Vous avez choisi de quitter. Au revoir!\n";
            }elsif ($choix == 1){
              ($dir,$dico) = ('français/anglais', 'dico_fr.txt');
            }else {
              ($dir,$dico) = ('anglais/français', 'dico_en.txt');
            }
          print "********** Traduction $dir **********\n";
          print "Entrez le mot à traduire : ";
          chomp(my $mot = <STDIN>);
          open DICO, "$dico"
             or die "E/S : $!\n";
        
          my $ligne;
          while($ligne = <DICO>){
            if ($ligne =~ /^$mot\b/){
              $trouve = 1;
              last;
            }
          }
          close DICO;
        
          if ($trouve == 0){
            open DICO,">> $dico" or die "E/S : $!\n";
            print "Entrez la traduction du mot inexistant : ";
            chomp( my $traduction = <STDIN>);
            print DICO "$mot $traduction\n";
          }else {
            print "$ligne";
          }
        }
        __END__
        
        Résultat français/anglais
        en gras tu verras le nouveau mot ajouté et c'est pareil pour anglais/français
        lami20j@deb:~/trash$ cat dico_fr.txt
        ami friend
        grand big
        lami20j@deb:~/trash$ perl ccm.pl
        Dictionnaire
        1. français/anglais
        2. anglais/français
        3. quitter
        Faites votre choix : 3
        Vous avez choisi de quitter. Au revoir!
        lami20j@deb:~/trash$ perl ccm.pl
        Dictionnaire
        1. français/anglais
        2. anglais/français
        3. quitter
        Faites votre choix : 1
        ********** Traduction français/anglais **********
        Entrez le mot à traduire : ami
        ami friend
        lami20j@deb:~/trash$ perl ccm.pl
        Dictionnaire
        1. français/anglais
        2. anglais/français
        3. quitter
        Faites votre choix : 1
        ********** Traduction français/anglais **********
        Entrez le mot à traduire : ville
        Entrez la traduction du mot inexistant : city
        lami20j@deb:~/trash$ cat dico_fr.txt
        ami friend
        grand big
        ville city
        
        Résultat anglais/français
        lami20j@deb:~/trash$ cat dico_en.txt
        friend ami
        big grand
        lami20j@deb:~/trash$ perl ccm.pl
        Dictionnaire
        1. français/anglais
        2. anglais/français
        3. quitter
        Faites votre choix : 3
        Vous avez choisi de quitter. Au revoir!
        lami20j@deb:~/trash$ perl ccm.pl
        Dictionnaire
        1. français/anglais
        2. anglais/français
        3. quitter
        Faites votre choix : 2
        ********** Traduction anglais/français **********
        Entrez le mot à traduire : friend
        friend ami
        lami20j@deb:~/trash$ perl ccm.pl
        Dictionnaire
        1. français/anglais
        2. anglais/français
        3. quitter
        Faites votre choix : 2
        ********** Traduction anglais/français **********
        Entrez le mot à traduire : city
        Entrez la traduction du mot inexistant : ville
        lami20j@deb:~/trash$ cat dico_en.txt
        friend ami
        big grand
        city ville
        

        tu fait ce que tu veux, mais si tu écrit de cette façon c'est plus pratique :-)
        Bon courage! ;-)
        1
        1. en fait tout bien réfléchi j prefere garder mon ecriture perl ...cela dit, comme j't'ai dit, si j'ai besoin d'aide, je te fais signe ;-)
          0
          1. Modérateur
            j prefere garder mon ecriture perl
            c'est ton choix et je le respecte :-))

            en revanche, je te conseille de faire d'abord l'algo avant d'écrire le code
            c'est une étape à ne pas sauter

            pour la partie aide, pas de problème :-))
            0
          2. pour le menu tkt pas je l'ai rajouté pask c clair k ca fait bien, c plus clair :-)
            pour la partie texte justement je comptais la commencer aujourd'hui vu le tps kil fait dehors lol...
            pour l'algo oui j vais le faire :-) ...
            et tkt pas j sais k tu n'imposes pas ton aide ;-)
            0
          3. j te redonne mon code pask j'ai rajouté une petite partie pour mettre les mots du fichier qui contient le texte francais (pask en fait il faut auss que la traduction de texte anglais soit possible) en retour chariot...normalement ce k'j'ai rajouté ressort en gras...

            #!usr/bin/perl
            use strict;
            use warnings;
            
            my $rep;
            my $rep2;
            my $rep3;
            my $mot_langue;
            my $mot_fr;
            my $mot_ang;
            my $trad_ang;
            my $trad_fr;
            my $texte_langue;
            my $texte_fr;
            my $trouve;
            my $ajout2;
            my $nomfich;
            my $fictexte_fr;
            my $ficdico_fr1;
            my $ligne;
            my $ligne2;
            my $ligne3;
            my $nomfich1;
            my $dico_fr1;
            my $ligne1;
            my $dico_ang1;
            my $ficdico_ang1;
            my $nomfich2;
            my $ajout1;
            my $dico_ajoutang;
            my $nomfich3;
            my $ajout3;
            my $fictexte_ang;
            my $texte_ang;
            my $nomfich4;
            my $longueur1;
            my $i;
            my $mot1;
            
            
            $trouve=0;
            
            $nomfich=shift;
            $nomfich1=shift;
            $nomfich2=shift;
            $nomfich3=shift;
            $nomfich4=shift;
            
            
            print ("Voulez-vous traduire un mot, O ou N ?");
            $rep=<STDIN>;
            chomp $rep;
            
            
            if ($rep eq "O") {
            	
            	print ("Voulez-vous traduire un mot francais en anglais, 0 ou N ?");
            	$rep2=<STDIN>;
            	chomp $rep2;
            	
            	
            	
            	if ($rep2 eq "O") {
            		print ("**********Dictionnaire francais anglais**********\n");
            		print ("tapez le mot francais a traduire \n");
            		$mot_fr=<STDIN>;
            		chomp $mot_fr;
            		
            		open $ficdico_fr1,'<',"dico_fr1.txt" or die "fichier non ouvert!\n";
            		while ($ligne=<$ficdico_fr1>) {
            			if ($ligne=~/^$mot_fr /) {
            				print ("$ligne\n");
            				$trouve=1;
            }
            			
            						
            					else {
            						
            						if ($trouve==0) {
            						open $ficdico_fr1,'>>',"dico_fr1.txt" or die "fichier non ouvert!\n";
            						$ajout1="\n$mot_fr";
            						print $ficdico_fr1 $ajout1;
            						close $ficdico_fr1;
            						open $ficdico_fr1,'<',"dico_fr1.txt" or die "fichier non ouvert!\n";
            						print " ";
            						
            						$trouve=1;
            
            }
            }
            }	 	
            }
            
            	else {
            		if ($rep2 eq "N") {
            			print ("**********Dictionnaire anglais francais**********\n");
            			print ("tapez le mot anglais a traduire \n");
            			$mot_ang=<STDIN>;
            			chomp $mot_ang;
            			
            			open $ficdico_ang1,'<',"dico_ang1.txt" or die "fichier non ouvert!\n";
            			while ($ligne1=<$ficdico_ang1>) {
            				if ($ligne1=~/^$mot_ang /) {
            					print ("$ligne1\n");
            					
            }
            			
            				}		
            	
            	}	
            }	
            }
            
            else {
            	if ($rep eq "N") {
            		
            		print ("Voulez-vous traduire un texte francais, O ou N ?\n");
            		$rep3=<STDIN>;
            		chomp $rep3;
            		
            		if ($rep3 eq "O") {
            		
            			print ("tapez le texte francais a traduire\n");
            			$texte_fr=<STDIN>;
            			chomp $texte_fr;
            	
            			open $fictexte_fr,'>>',"texte_fr.txt" or die "fichier non ouvert!\n";
            			$ajout2="\n$texte_fr";
            			print $fictexte_fr $ajout2;
            			close $fictexte_fr;
            			open $fictexte_fr,'<',"texte_fr.txt" or die "fichier non ouvert!\n";
            			print " ";
            
            
            			$longueur1=length($texte_fr);
            $i=0;
            $mot1="";
            
            			while ($i<$longueur1){
            				if (substr($texte_fr,$i,1) ne " ") {
            		 		$mot1=$mot1.substr($texte_fr,$i,1);
            }
            
            		 	else {
            			 
            				print ("$mot1\n");
            			 	$mot1="";
            			 
            }
            			 if ($i==$longueur1-1) {
            				print ( "$mot1\n");
            				 
            }
            				 $i=$i+1;
            				 
            }
            
            
             
            }	
            
            		else {
            			if ($rep3 eq "N") {
            				
            				print ("tapez le texte anglais a traduire\n");
            				$texte_ang=<STDIN>;
            				chomp $texte_ang;
            				
            				open $fictexte_ang,'>>',"texte_ang.txt" or die "fichier non ouvert!\n";
            				$ajout3="\n$texte_ang";
            				print $fictexte_ang $ajout3;
            				close $fictexte_ang;
            				open $fictexte_ang,'<',"texte_ang.txt" or die "fichier non ouvert!\n";
            				print " ";
            
            				while ($ligne3=<$fictexte_ang>) {
            				print $ligne3;
            	
            }
            }
            }					
            }
            }


            mon souci est de savoir si c possible de mettre $mot1 en tableau pour ensuite les comparer avec la partie traduction des lignes de mes fichiers dictionnaires ("jeu game" pour F/A et "game jeu" pour A/F) ou si j dois faire des boucles "for", une qui prendrait le mot sur une ligne et une qui parcourrait les lignes ...??

            tu comprends ce k j veux faire ou pas ??....ptetr k ma facon d'expliker n'est pas très claire...

            merci d'avance en tout cas !
            0
          4. juste pour dire que le fait d'avoir mis $mot1 en tableau ne me sert a rien puisk je veux traiter un texte et k ca ressorte en texte et pas en tableau...bref !
            sinon j'ai rajouté la partie pour l'ajout des mots non connus et leur traduction dans le dico mais maintenant que je l'ai mise la partie traduction pure et simple de mots ne marche plus et je ne comprends pas pkoi ; autre chose : pour l'ajout dans le dico, seule l 'ajout dans le dico anglais marche vraiment et les mots apparaissent dans le dico a l'inverse du dico francais...sauf k'en enlevant la partie sur l'ajout des mots et de leur traduction dans le dico, la partie traduction remarche bien sûr mais pour le dico francais, les mots que j'ai voulu rajouter marchent aussi alors qu'ils ne sont pas ecrits dans le dico !!! va comprendre !!!
            bref....
            voila !
            0
        2. Modérateur
          Salut,

          non, dans ton code il n'y a pas besoin

          en revanche je trouve que la version avec un menu c'est plus agréable et justifié
          au mois on a à l'écran le menu de ce qu'on peut faire
          à toi de voir

          avant de commencer de coder pour la partie texte/remplacement
          vaut mieux faire un algo pour voir ce que ça donne
          0
          1. ok !!
            merci pour tes explications...
            et le "last" j peux le mettre avec mon ecriture perl à moi ?...
            0
            1. Modérateur
              pour 1

              c'est l'écriture here document sur Perl
              ça evite d'écrire plusieurs lignes avec print

              print "Dictionnaire\n\n";
              print "1. français/anglais\n";
              print "2. anglais/français\n";
              print "3. quitter\n"

              pour 2

              \b sers pour ancrer le mot
              par exemple si tu as le mot ami dans le dico fr - en
              si tu tapes
              am
              le mot sera reconnu
              mais avec \b il n'y a pas de risque

              tu peux enlever le \b et faire des tests

              pour 3

              la boucle while parcours toutes les lignes
              mais ça ne sers à rien si le mot est trouvé
              avec last on sors de la boucle si le mot est trouvé

              tu peux enlever last et tu verras le résultat

              Ex
              si le dico contient
              ami friend
              grand big
              fille girl

              si je teste le mot ami par exemple
              que ce passera?
              le mot est trouvé et $trouve mis à 1
              mais la boucle va continuer
              le mot ne correspond pas à grand donc $trouve est mis à 0
              et ainsi de suite

              en bref, le test sur la derniere ligne sera pris en compte
              avec last je m'arrête de que je trouve le mot et $trouve est 1
              ou je continue jusqu'à la fin et $trouve est zéro

              0
              1. Re !!
                Non ca va j'aime bien... :-)
                Mais y a deux trois trucs que je comprends pas....ne m'en veux pas lol !!

                1-
                print <<"FIN";
                Dictionnaire

                1. français/anglais
                2. anglais/français
                3. quitter
                FIN

                -> à quoi ca sert ?...je ne connais pas cette trnascription...

                2-
                if ($ligne =~ /^$mot_fr\b/){

                -> le \b/ ca correspond a quoi ?

                3-
                while($ligne = <DICO_FR_EN>){
                if ($ligne =~ /^$mot_fr\b/){
                $trouve = 1;
                last;

                -> ca sert a quoi "last" ?...

                voila voila sinon oui on peut continuer ;-)
                Merci bcp pour ton aide en tout cas....
                0
                1. Modérateur
                  voilà une petit script qui fera ce que tu as besoin pour l'instant
                  j'ai gardé $trouve
                  qu'en penses-tu

                  le code n'est pas difficile et il garde la structure de ton code :-)
                  pour les phrases ça sera un peu pareil
                  si ça te va comme ça on peut continuer :-)) (personne ne va nier ton travail ;-)

                  #!/usr/bin/perl
                  use strict;use warnings;
                  
                  my $trouve = 0;
                  
                  print <<"FIN";
                  Dictionnaire
                  
                  1. français/anglais
                  2. anglais/français
                  3. quitter
                  FIN
                  
                  print "Faites votre choix : ";
                  chomp (my $rep = <STDIN>);
                  
                  if ($rep eq '1'){
                    print "********** Traduction français/anglais **********\n";
                    print "Entrez le mot à traduire : ";
                    chomp(my $mot_fr = <STDIN>);
                  
                    open DICO_FR_EN, "dico_fr.txt"
                     or die "E/S : $!\n";
                    my $ligne;
                    while($ligne = <DICO_FR_EN>){
                      if ($ligne =~ /^$mot_fr\b/){
                        $trouve = 1;
                        last;
                      }
                    }
                    close DICO_FR_EN;
                    if ($trouve == 0){
                      open FR_EN,">> dico_fr.txt" or die "E/S : $!\n";
                      print "Entrez la traduction du mot inexistant : ";
                      chomp( my $traduction = <STDIN>);
                      print FR_EN "$mot_fr $traduction\n";
                    }else {
                      print "$ligne\n";
                    }
                  }elsif ($rep eq '2'){
                    print "********** Traduction anglais/français **********\n";
                    print "Entrez le mot à traduire : ";
                    chomp(my $mot_en = <STDIN>);
                  
                    open DICO_EN_FR, "dico_en.txt"
                     or die "E/S : $!\n";
                    my $ligne;
                    while($ligne = <DICO_EN_FR>){
                      if ($ligne =~ /^$mot_en\b/){
                        $trouve = 1;
                        last;
                      }
                    }
                    close DICO_EN_FR;
                    if ($trouve == 0){
                      open EN_FR,">> dico_en.txt" or die "E/S : $!\n";
                      print "Entrez la traduction du mot inexistant : ";
                      chomp( my $traduction = <STDIN>);
                      print EN_FR "$mot_en $traduction\n";
                    }else {
                      print "$ligne\n";
                    }
                  }elsif ($rep eq '3'){
                     die "Vous avez choisir de quitter. Au revoir!\n";
                  }
                  __END__
                  0
                  1. ok ok ! :-)
                    pour le script que tu as modifié, oui je l'ai testé et effectivement c mieux :-) j'ai aussi compris mon erreur avec les chomp et STDIN donc merci (!!) pask pour moi c t machinal en fait c pour ca...lol
                    sinon pour le script, le souci c kil ne me rajoute pas le mot que je cherche a traduire sil n'existe pas dans le dico :-s ...

                    voila voila !
                    0
                    1. Modérateur
                      oui, c'est clair :-))

                      toutefois, as-tu testé ton script avec la modif que j'ai fait?
                      0
                      1. qques lignes de mon dico francais/anglais :
                        jeu game
                        choix choice
                        voiture car
                        ...

                        et les lignes pour mon dico anglais/francais sont les mm mais a l envers bien sur...

                        en fait ce que doit faire mon programme c'est :
                        soit traduire un ou plusieurs mots (donc tant qu'il le souhaite) soit traduire un texte français

                        pour la traduction de un ou plusieurs mots (je n'ai pas encore fait la partie pour "plusieurs mots"...faudra que je me penche dessus d'ici peu) :
                        - choix du sens (francais/anglais ou l'inverse)
                        - si le mot que l'on veut traduire est dans le dico alors le programme donne la ligne de traduction ; si le mot n'y est pas il faut l'ajouter avec sa traduction dans le(s) dico(s)

                        pour la traduction du texte
                        -le programme parcourt le texte
                        -quand un mot du texte n'est pas dans le dico, il ya demande de traduction et ajout dans le(s) dico(s)

                        voila j'espere que c'est plus clair...
                        0
                        1. Modérateur
                          voilà ton script
                          ce que tu vois en gras c'est le commentaire pour ton problème avec $trouve
                          #!usr/bin/perl
                          use strict;use warnings;
                          
                          my $rep;
                          my $rep2;
                          my $mot_langue;
                          my $mot_fr;
                          my $mot_ang;
                          my $trad_ang;
                          my $trad_fr;
                          my $texte_langue;
                          my $trouve;
                          my $ajout2;
                          my $nomfich;
                          my $fic_fr;
                          my $ficdico_fr1;
                          my $ligne;
                          my $nomfich1;
                          my $dico_fr1;
                          my $ligne1;
                          my $dico_ang1;
                          my $ficdico_ang1;
                          my $nomfich2;
                          my $ajout1;
                          my $dico_ajoutang;
                          
                          $trouve=0;
                          $nomfich=shift;
                          $nomfich1=shift;
                          $nomfich2=shift;
                          
                          print ("Voulez-vous traduire un mot, O ou N ?");
                          $rep=<STDIN>;
                          chomp $rep;
                          
                          if ($rep eq "O") {
                            print ("Voulez-vous traduire un mot francais en anglais, 0 ou N ?");
                            $rep2=<STDIN>;
                            chomp $rep2;
                            if ($rep2 eq "O") {
                              print ("tapez le mot francais à traduire : ");
                              $mot_fr=<STDIN>;
                              chomp $mot_fr;
                              open $ficdico_fr1,'>>',"dico_fr1.txt" or die "fichier non ouvert!\n";
                              close $ficdico_fr1;
                              open $ficdico_fr1,'<',"dico_fr1.txt" or die "fichier non ouvert!\n";
                              while ($ligne=<$ficdico_fr1>) {
                                if ($ligne=~/^$mot_fr /) {
                                  print ("$ligne");
                                  $trouve=1;
                                }else {
                                  if ($trouve==0) {
                                    open $ficdico_fr1,'>>',"dico_fr1.txt" or die "fichier non ouvert!\n";
                                    $ajout1="\n$mot_fr";
                                    print $ficdico_fr1 $ajout1;
                                    close $ficdico_fr1;
                                    open $ficdico_fr1,'<',"dico_fr1.txt" or die "fichier non ouvert!\n";
                                    print " ";
                                    $trouve = 1; # pour sortir de la boucle il faut mettre $trouve à 1
                                                 # sinon il sera toujours 0, donc tu as une boucle infini
                                                 # puisque la condition est toujours vraie if ($trouve == 0)
                                                 # quand tu mets $trouve = 1 la condition n'est plus remplis
                                                 # donc tu sors de la boucle
                                  }
                                }
                              }
                            }else {
                              if ($rep2 eq "N") {
                                print ("tapez le mot anglais à traduire \n");
                                $mot_ang=<STDIN>;
                                chomp $mot_ang;
                                open $ficdico_ang1,'>>',"dico_ang1.txt" or die "fichier non ouvert!\n";
                                close $ficdico_ang1;
                                open $ficdico_ang1,'<',"dico_ang1.txt" or die "fichier non ouvert!\n";
                                while ($ligne1=<$ficdico_ang1>) {
                                  if ($ligne1=~/^$mot_ang /) {
                                    print ("$ligne1\n");
                                    $ligne1=<STDIN>;
                                    chomp $ligne1;
                                  }
                                }
                              }
                            }
                          }else {
                            if ($rep eq "N") {
                              print ("tapez le texte à traduire \n");
                              $texte_langue=<STDIN>;
                              chomp $texte_langue;
                            }
                          }
                          __END__
                          
                          0
                          1. Modérateur
                            while ($ligne=<$ficdico_fr1>) {
                            if ($ligne=~/^$mot_fr /) {
                            print ("$ligne\n");
                            $ligne=<STDIN>;
                            chomp $ligne;
                            $trouve=1;


                            je ne comprends pas non plus ce que tu veux faire ici

                            $ligne contiendra au fur à mesure les lignes du fichier ficdico_fr1
                            alors pourquoi tu demandes une entrée depuis STDIN pour $ligne?

                            dit moi si je comprends bien ton problème

                            tu as 2 fichiers dico
                            le fichier dico_fr qui est un dictionnaire français/anglais

                            ami (nom) - friend.• boyfriend (petit ami).• girlfriend (petite amie).
                            .
                            .
                            et le fichier dico_ang qui est un dictionnaire anglais/français

                            friend (nom) - ami.• familier.• camarade.
                            .
                            .

                            ensuite ton script demande un mot en français ou en anglais
                            en fonction de cas tu vérifies si le mot existe déjà dans le dictionnaire
                            si c'est le cas alors tu affiche la traduction
                            sinon tu ajoutes mot au dictionnaire

                            ai-je bien compris?
                            0
                            1. Modérateur
                              open $ficdico_fr1,'>>',"dico_fr1.txt" or die "fichier non ouvert!\n";
                              close $ficdico_fr1;


                              je ne comprends pas pourquoi tu écris ça
                              ça ne sers à rien
                              tu ouvres un fichier en mode ajout et toute de suite tu le ferme sans faire une opération quelconque
                              donc c'est inutile

                              ça m'aidera aussi si tu me donnes tes fichiers (je n'ai pas besoin des fichies complets, juste quelques lignes pour tester en réelle)
                              0
                              1. ok je t'envoie ca...autant c moi qui me suis gourrée qque part...

                                #!usr/bin/perl
                                use strict;
                                use warnings;
                                
                                my $rep;
                                my $rep2;
                                my $mot_langue;
                                my $mot_fr;
                                my $mot_ang;
                                my $trad_ang;
                                my $trad_fr;
                                my $texte_langue;
                                my $trouve;
                                my $ajout2;
                                my $nomfich;
                                my $fic_fr;
                                my $ficdico_fr1;
                                my $ligne;
                                my $nomfich1;
                                my $dico_fr1;
                                my $ligne1;
                                my $dico_ang1;
                                my $ficdico_ang1;
                                my $nomfich2;
                                my $ajout1;
                                my $dico_ajoutang;
                                
                                
                                $trouve=0;
                                
                                $nomfich=shift;
                                $nomfich1=shift;
                                $nomfich2=shift;
                                
                                print ("Voulez-vous traduire un mot, O ou N ?");
                                $rep=<STDIN>;
                                chomp $rep;
                                
                                
                                if ($rep eq "O") {
                                	
                                	print ("Voulez-vous traduire un mot francais en anglais, 0 ou N ?");
                                	$rep2=<STDIN>;
                                	chomp $rep2;
                                	
                                	if ($rep2 eq "O") {
                                		print ("tapez le mot francais à traduire \n");
                                		$mot_fr=<STDIN>;
                                		chomp $mot_fr;
                                		
                                		open $ficdico_fr1,'>>',"dico_fr1.txt" or die "fichier non ouvert!\n";
                                		close $ficdico_fr1;
                                		open $ficdico_fr1,'<',"dico_fr1.txt" or die "fichier non ouvert!\n";
                                		while ($ligne=<$ficdico_fr1>) {
                                			if ($ligne=~/^$mot_fr /) {
                                				print ("$ligne\n");
                                				$ligne=<STDIN>;
                                				chomp $ligne;
                                				$trouve=1;
                                }
                                			
                                						
                                					else {
                                						
                                						if ($trouve==0) {
                                						open $ficdico_fr1,'>>',"dico_fr1.txt" or die "fichier non ouvert!\n";
                                						$ajout1="\n$mot_fr";
                                						print $ficdico_fr1 $ajout1;
                                						close $ficdico_fr1;
                                						open $ficdico_fr1,'<',"dico_fr1.txt" or die "fichier non ouvert!\n";
                                						print " ";
                                
                                }
                                }
                                }	 	
                                }
                                
                                
                                	else {
                                		if ($rep2 eq "N") {
                                			print ("tapez le mot anglais à traduire \n");
                                			$mot_ang=<STDIN>;
                                			chomp $mot_ang;
                                			
                                			open $ficdico_ang1,'>>',"dico_ang1.txt" or die "fichier non ouvert!\n";
                                			close $ficdico_ang1;
                                			open $ficdico_ang1,'<',"dico_ang1.txt" or die "fichier non ouvert!\n";
                                			while ($ligne1=<$ficdico_ang1>) {
                                				if ($ligne1=~/^$mot_ang /) {
                                					print ("$ligne1\n");
                                					$ligne1=<STDIN>;
                                					chomp $ligne1;
                                }
                                			
                                				}		
                                	
                                	}	
                                }	
                                }
                                
                                else {
                                	if ($rep eq "N") {
                                	print ("tapez le texte à traduire \n");
                                	$texte_langue=<STDIN>;
                                	chomp $texte_langue;
                                }
                                }


                                voila !
                                merci d'avance...
                                0
                                1. Modérateur
                                  Salut,

                                  affiche ici la dernière version de ton script et utilise les balises code pour la lisibilité
                                  merci
                                  0
                                  1. coucou juste pour te dire que j'ai essayé de faire avec la variable $trouve mais ca ne marche pas :-s....je comprends pas pkoi....
                                    0
                                    1. salut,
                                      contente de t'avoir un peu eclairée.
                                      bonne continuation pour la suite ;)
                                      ++
                                      0
                                      1. Modérateur
                                        Salut,

                                        je prefere l'ecrire toute seule
                                        c'est toi qui vois et j'apprecie :-))
                                        0
                                        • 1
                                        • 2
                                        • 3