Problème avec mon programme perl

Résolu
karinn Messages postés 49 Statut Membre -  
karinn Messages postés 49 Statut Membre -
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

  • 1
  • 2
  • 3
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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. touriste77 Messages postés 32 Statut Membre 25
     
    salut,
    et si tu utilisais des booléens à la place des oui/non? c'est-à-dire remplace tes oui par 1 et tes non par 0. parce que oui (ou non) n'est ni une variable, ni une chaine, ni une constante (je pense que le blem vient de la...)
    j'espère t'avoir aidée
    bonne continuation
    0
  3. karinn
     
    ah oui effectivement j'y avais pas pensé...j vais essayer !!
    merci pour ton aide !
    0
  4. karinn Messages postés 49 Statut Membre 1
     
    alors maintenant j'ai changé les trucs ca marche mais il me dit k le fichier ne s ouvre pas :-s
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. touriste77 Messages postés 32 Statut Membre 25
     
    re salut,
    vérifie que tes fichiers textes (tes dico) sont dans le bon répertoire.
    sinon essaie de changer les 'open' : je me trompe peut-être, mais je n'ai jamais vu des open avec 3 arguments. essaie de faire
    open ($ficdico_fr,"< dico_fr.txt" or die "fichier non ouvert!\n");
    au lieu de mettre le '<' à part.

    tiens moi au courant.
    s'il y a encore un souci, on continuera à chercher ;-)
    bonne continuation
    0
  7. karinn Messages postés 49 Statut Membre 1
     
    salut ben ca ne marche pas...
    par contre comment je peux savoir si mes fichiers sont dans le bon repertoire ?...
    merci d'avance
    a plus
    0
  8. touriste77 Messages postés 32 Statut Membre 25
     
    salut,
    tes fichiers doivent être dans le même répertoire que ton programme perl.
    au fait, je me suis trompée d'endroit pour fermer la parenthèse :D.
    ça devrait être
    open ($ficdico_fr,"< dico_fr.txt") or die "fichier non ouvert!\n";
    à plus.
    0
  9. karinn Messages postés 49 Statut Membre 1
     
    salut
    ils snt bien dans le meme repertoire k mes scripts donc j comprends pas pkoi il m ouvre pas mon fichier...pask en plus avec l'autre fichier (pask la ce n'est qu'une partie de mon programme...j'ai deja commencé un peu la suite....)que j'ouvre aps ca marche....
    en fait là ce que j cherche a faire c lire un fichier qui contient des traductions de mots...le souci c k pour le moment il n'y a rien dedans...tu crois k c pour ca kil m disent kil é non ouvert ? tu crois kil fodrait que je le crée d'abord avec une commande ?....
    Merci de ton aide

    p.s.:pour ta commande elle marche mais le fichier ne s'ouvre toujours pas
    0
  10. karinn Messages postés 49 Statut Membre 1
     
    voila c bon ca marche...en fait il fallait que je crée mon fichier d'abord ce que j'avais zappé de faire...
    cela dit, si j'ai encore un souci sur mon programme, j'écrirai ! ...et comme je sais k je ne suis pas encore au bout de mes peines....
    voila voila...
    bye a plus !
    0
  11. touriste77 Messages postés 32 Statut Membre 25
     
    cool!! n'hésite pas à écrire si t'as encore des soucis ;)
    ++
    0
  12. karinn
     
    bah voilà de nouveau prise de tete !!! lol
    donc voila j'ai créé mon fichier (j'ai mis qques traductions dedans) et j'ai mis la commande pour pouvoir le lire.
    et maintenant il faut que de ce fichier, j puisse afficher la ligne de traduction qui contient le mot que je voulais traduire...
    ex: le mot à traduire est le mot "jeu" et la ligne du fichier que je veux afficher c'est "jeu game".

    merci d'avance!
    0
  13. touriste77 Messages postés 32 Statut Membre 25
     
    salut,
    voilà un modèle pour rechercher une ligne contenant un mot particulier dans un fichier, en utilisant les expressions régulières. tu adapteras, ok? ;)
    open (FICDICO_FR,"< dico_fr.txt" or die "fichier non ouvert!\n");
    while ($ligne = <FICDICO_FR>) {
        if ($ligne = ~/^$mot/) {
            print "$ligne\n";
        }
    }
    remarque : rajoute un espace à la fin de $mot pour que la recherche reconnaisse le mot et non les mots qui commencent par $mot (sinon, il reconnaîtrait aussi "jeudi" par exemple quand tu cherches "jeu")
    bonne continuation
    ++
    0
  14. karinn Messages postés 49 Statut Membre 1
     
    Merci ca marche !! :-)
    par contre tu pourrais juste m'expliker la sigification des expressions regulieres dans ta commande stp ?...que j m'endorme moins bete ce soir lol. (puisk je n'ai pas l'habitude de les utiliser en fait...j'les ai pas trop apprises en cours...)
    ~/^/$mot_fr /

    Merci d'avance...
    et si jms j'ai un souci, j'ecris !!!
    0
  15. touriste77 Messages postés 32 Statut Membre 25
     
    salut,
    contente d'avoir pu t'aider. en fait, dans
    $ligne = ~/^$mot/
    =~ sert à lier $ligne et une expression régulière
    / sert à délimiter le motif, c'est-à-dire le mot rechercher (ici, $mot)
    ^ dit que $mot doit apparaître en début du mot reconnu par l'expressoin régulière.

    voilà un site que j'ai trouvé intéressant et super clair sur le sujet : https://formation-perl.fr/guide-perl-08.html

    bonne lecture ;)
    ++
    0
  16. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    je viens à la fin quand le problème est résolu :-))

    je me permets de faire quelques remarques. :-)

    =~ sert à lier $ligne et une expression régulière
    =~ est un opérateur binaire qui applique un motif de reconnaissance à une expression scalaire.

    / sert à délimiter le motif, c'est-à-dire le mot rechercher (ici, $mot)

    il s'agit d'opérateur m// pour les regex (m n'est pas obligatoire)

    voici l'opérateur avec ses modificateurs
    m/MOTIF/cgimosx


    ^ dit que $mot doit apparaître en début du mot reconnu par l'expressoin régulière.

    il dit plutôt que le contenu de la variable $mot est ancré en début de la chaîne.

    Et puisqu'on est en Perl mieux vaut apprendre l'art d'écrire en Perl :-))

    Au lieu de
    open (FICDICO_FR,"< dico_fr.txt" or die "fichier non ouvert!\n");
    on peut écrire
    open FICDICO_FR,"dico_fr.txt" or die "fichier non ouvert!\n";

    Le fichier est en lecture par défaut donc pas besoin de <
    Si on utilise or pas besoin de paranthèses vu la priorité des opérateurs (or a la plus basse)
    0
  17. karinn
     
    merci pour vos explications a tous les deux...
    je vais m'empresser d'aller sur le site que tu m'as indiqué :-)
    a plus !
    0
  18. touriste77 Messages postés 32 Statut Membre 25
     
    de rien ;)
    ++
    0
  19. karinn Messages postés 49 Statut Membre 1
     
    salut !!
    tu te souviens du dernier pbk j'ai eu ?...: et maintenant il faut que de ce fichier, j puisse afficher la ligne de traduction qui contient le mot que je voulais traduire...
    ex: le mot à traduire est le mot "jeu" et la ligne du fichier que je veux afficher c'est "jeu game".

    bah en fait, est ce kil est possible de faire qqch qui donne le mm resultat mais avec une variable $trouve=oui/non ?
    pask en fait j'ai essayé de faire mon else { if { mais il ne marche pas...alors a moins que ce soit moi qui ait fait une erreur dedans...
    le "else if" se fait bien,d'apres ce k tu m'as donné la derniere fois, avec le "!"...rassure moi...
    en fait j te demande ca pour la variable $trouve pask pour le "else if", en gros ca donne : si le mot que je cherche a traduire ($mot_fr) n'est pas dans le fichier traduction ($ficdico_fr1) (donc en gros si le programme ne le trouve pas dans le fichier), il faut que je le rajoute dans le dico...donc je me disais qu'il faudrait peut etre la variable $trouve. cela dit, si c'est possible de le faire avec la commande que tu m'as donné la derniere fois c pas mal non plus...lol

    voila !!
    merci d'avance
    a plus
    0
  20. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    $trouve=non;

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

    }


    Pour commencer, je ne sais pas ce que tu obtiens comme résultat, mais ce code n'est pas bon
    D'abord sache que "oui" c'est une chaîne de caractère et l'affectation de la variable $trouve on peu la faire

    $trouve = 'oui';
    ou
    $trouve = "oui";

    il y a encore des possibilités mais je m'arrête là

    ensuite quand on fait le teste avec une chaîne on utilise les opérateurs (comparaison et égalité) eq, ne, etc et pas == & Cie (qui teste les variables numériques)
    dans ton cas
    $trouve eq "oui" au lieu de $trouve == oui
    bah en fait, est ce kil est possible de faire qqch qui donne le mm resultat mais avec une variable $trouve=oui/non ?

    En bref, pour repondre à ta question, oui c'est possible.

    0
  21. karinn Messages postés 49 Statut Membre 1
     
    ok merci pour ton aide !!!
    a plus...
    0
  • 1
  • 2
  • 3