Problème avec mon programme perl
Résolu
karinn
Messages postés
49
Date d'inscription
Statut
Membre
Dernière intervention
-
karinn Messages postés 49 Date d'inscription Statut Membre Dernière intervention -
karinn Messages postés 49 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Problème avec mon programme perl
- Programme demarrage windows - Guide
- Mettre en veille un programme - Guide
- Message programmé iphone - Guide
- Programme word gratuit - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
43 réponses
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
en gras tu verras le nouveau mot ajouté et c'est pareil pour anglais/français
tu fait ce que tu veux, mais si tu écrit de cette façon c'est plus pratique :-)
Bon courage! ;-)
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 cityRé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! ;-)
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
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
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 faire
tiens moi au courant.
s'il y a encore un souci, on continuera à chercher ;-)
bonne continuation
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
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
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 être
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.
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
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 !
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 !
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!
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? ;)
bonne continuation
++
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 !!!
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
/ 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 ;)
++
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 modificateurs
^ 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
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)
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 !
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
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.
$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.