Problème avec mon programme perl
Résolukarinn Messages postés 49 Statut Membre -
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
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.
-
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çaislami20j@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çaislami20j@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! ;-) -
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 -
-
alors maintenant j'ai changé les trucs ca marche mais il me dit k le fichier ne s ouvre pas :-s
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 faireopen ($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 -
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 -
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 êtreopen ($ficdico_fr,"< dico_fr.txt") or die "fichier non ouvert!\n";
à plus.
-
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 -
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 ! -
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! -
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
++ -
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 !!! -
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 ;)
++
-
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 modificateursm/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 écrireopen 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 ! -
-
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 -
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.
-
- 1
- 2
- 3