Problème avec mon programme perl
Résolu/Fermé
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
-
16 juil. 2007 à 17:18
karinn Messages postés 49 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 10 mai 2009 - 16 août 2007 à 11:53
karinn Messages postés 49 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 10 mai 2009 - 16 août 2007 à 11:53
A voir également:
- Problème avec mon programme perl
- Programme demarrage windows 10 - Guide
- Désinstaller programme windows 10 - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Forcer la fermeture d'un programme - Guide
- Sms programmé - Guide
43 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
15 août 2007 à 12:24
15 août 2007 à 12:24
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! ;-)
touriste77
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
17 juil. 2007 à 01:01
17 juil. 2007 à 01:01
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
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
17 juil. 2007 à 20:52
17 juil. 2007 à 20:52
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
touriste77
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
17 juil. 2007 à 23:56
17 juil. 2007 à 23:56
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
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
18 juil. 2007 à 12:53
18 juil. 2007 à 12:53
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
touriste77
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
18 juil. 2007 à 13:00
18 juil. 2007 à 13:00
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.
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
19 juil. 2007 à 11:01
19 juil. 2007 à 11:01
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
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
19 juil. 2007 à 11:24
19 juil. 2007 à 11:24
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 !
touriste77
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
19 juil. 2007 à 13:37
19 juil. 2007 à 13:37
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!
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!
touriste77
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
20 juil. 2007 à 23:02
20 juil. 2007 à 23:02
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
++
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
22 juil. 2007 à 12:50
22 juil. 2007 à 12:50
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 !!!
touriste77
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
22 juil. 2007 à 14:20
22 juil. 2007 à 14:20
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 ;)
++
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 juil. 2007 à 12:54
23 juil. 2007 à 12:54
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 !
touriste77
Messages postés
32
Date d'inscription
vendredi 29 juin 2007
Statut
Membre
Dernière intervention
29 octobre 2009
25
23 juil. 2007 à 18:41
23 juil. 2007 à 18:41
de rien ;)
++
++
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
25 juil. 2007 à 13:55
25 juil. 2007 à 13:55
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
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
25 juil. 2007 à 14:15
25 juil. 2007 à 14:15
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.
karinn
Messages postés
49
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
10 mai 2009
1
26 juil. 2007 à 20:23
26 juil. 2007 à 20:23
ok merci pour ton aide !!!
a plus...
a plus...