Problème avec mon programme perl [Résolu/Fermé]

Signaler
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
-
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
-
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

43 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
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
ah oui effectivement j'y avais pas pensé...j vais essayer !!
merci pour ton aide !
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
alors maintenant j'ai changé les trucs ca marche mais il me dit k le fichier ne s ouvre pas :-s
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
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
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
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
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
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.
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
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
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
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 !
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
cool!! n'hésite pas à écrire si t'as encore des soucis ;)
++
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!
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
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
++
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
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 !!!
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
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 ;)
++
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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)
merci pour vos explications a tous les deux...
je vais m'empresser d'aller sur le site que tu m'as indiqué :-)
a plus !
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
de rien ;)
++
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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.

Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
ok merci pour ton aide !!!
a plus...