[perl] données qui n'est pas prise en compte
mathieu
-
simpson -
simpson -
Bonjour à tous,
J'ai un petit probleme en perl, langage que je commence à apprendre
Je lis un fichier de la foreme suivante :
pers��er:halten
respecter:nachkommen
retenir:abhalten
satisfaire:nachkommen
se conformer:nachkommen
se maintenir:halten
soutenir:halten
suivre:halten
supporter:aushalten
tenir:abhalten,arten nach,ausdauern,aushalten,austragen,durchfhren,existieren,festsitzen,fortleben,geraten nach,halten,h�gen an,innehaben,nachkommen,nachschlagen,schlagen nach,sich beschr�ken auf,sich einschr�ken auf,sich festhalten an,weiterleben,berleben
Tout d'abord je split mon fichier de la façon suivante
je voudrais parcourir mon fichier de façon à obtenir pour chaque occurence une liste qui correspond
mon probleme est qu'il lit le premier élément, le traite et passe au second mais ne le prend pas en compte. En gros il ne prend pas en compte le deuxieme éléments de ma liste.
Par contre le tout dernier élément est pris en compte
si j'inverse les mots de mon fichier de départ, il fait la même chose donc ce n'est pas un problème au niveau de mes tables de hachages
J'avoue que je suis un peu perdu et avoirr fait plein de tests différents sans trouver d'où provient l'erreur donc je m'en viens voir si une aide est possible de votre part.
Amicalement Mathieu
J'ai un petit probleme en perl, langage que je commence à apprendre
Je lis un fichier de la foreme suivante :
pers��er:halten
respecter:nachkommen
retenir:abhalten
satisfaire:nachkommen
se conformer:nachkommen
se maintenir:halten
soutenir:halten
suivre:halten
supporter:aushalten
tenir:abhalten,arten nach,ausdauern,aushalten,austragen,durchfhren,existieren,festsitzen,fortleben,geraten nach,halten,h�gen an,innehaben,nachkommen,nachschlagen,schlagen nach,sich beschr�ken auf,sich einschr�ken auf,sich festhalten an,weiterleben,berleben
Tout d'abord je split mon fichier de la façon suivante
open(TRAD,$trad_direct) || die ("Le fichier n'existe pas\n"); while(<TRAD>){ my ($verbe, $liste) = split /:/,$_,2; push @ved_direct_fr_all,$verbe, split /,/,$liste; }
je voudrais parcourir mon fichier de façon à obtenir pour chaque occurence une liste qui correspond
for (my $i =0 ; $i < @ved_direct_fr_all;$i++) { print"$i :: $ved_direct_fr_all[$i]\n"; if(grep { /$ved_direct_fr_all[$i]/ } @vedette_all){ print("entre dans boucle if 2\n"); } if(grep { /$ved_direct_fr_all[$i]/ } @vedette_fr) { print("entre dans boucle if 1\n"); } print "fin de la boucle"; }
mon probleme est qu'il lit le premier élément, le traite et passe au second mais ne le prend pas en compte. En gros il ne prend pas en compte le deuxieme éléments de ma liste.
Par contre le tout dernier élément est pris en compte
si j'inverse les mots de mon fichier de départ, il fait la même chose donc ce n'est pas un problème au niveau de mes tables de hachages
J'avoue que je suis un peu perdu et avoirr fait plein de tests différents sans trouver d'où provient l'erreur donc je m'en viens voir si une aide est possible de votre part.
Amicalement Mathieu
A voir également:
- [perl] données qui n'est pas prise en compte
- Comment savoir qui regarde mon compte facebook - Guide
- Créer un compte google - Guide
- Installer windows 10 sans compte microsoft - Guide
- Créer un compte gmail - Guide
- Compte facebook désactivé - Guide
6 réponses
Salut,
je crois qu'on c'est déjà vu.
Pour ton problème j'ai faut un petit exemple sur les numéros pairs et impairs (donc une analogie avec tes mot fr et all)
Donc le passage et fait et les valeurs sont pris en compte.
Je te propose d'écrire ta boucle de façon suivante
Voir aussi le conténu de tes tableaux.
Je te propose aussi, pour mieux comprendre ta façon de le faire d'écrire le script complet que tu as (et pas seulement les morceau de code qui t'interesses)
Je te donne l'exemple que j'ai fait, et essaie de le comprendre, entre temps je vais étudier un peu tes morceaux du code.
Voilà l'exemple que j'ai écrit pour toi
je crois qu'on c'est déjà vu.
Pour ton problème j'ai faut un petit exemple sur les numéros pairs et impairs (donc une analogie avec tes mot fr et all)
Donc le passage et fait et les valeurs sont pris en compte.
Je te propose d'écrire ta boucle de façon suivante
if ( condition1) { traitement... } elsif (condition2){ traitement... } else { que ce passe-t-il si les conditions 1 ou 2 ne sont pas traitées }
Voir aussi le conténu de tes tableaux.
Je te propose aussi, pour mieux comprendre ta façon de le faire d'écrire le script complet que tu as (et pas seulement les morceau de code qui t'interesses)
Je te donne l'exemple que j'ai fait, et essaie de le comprendre, entre temps je vais étudier un peu tes morceaux du code.
Voilà l'exemple que j'ai écrit pour toi
#! /usr/bin/perl use warnings;use strict; my @pair = qw/2 4/; my @impair = qw/1 3/; my (@res1,@res2); foreach my $val (0..6){ print "====Debut FOREACH====\n"; if (grep { /$val/ } @pair){ print "Debut IF1\n"; push @res1,$val; print "\@res1 : @res1 pair\n"; print "Fin IF1\n"; } elsif (grep { /$val/ } @impair){ print "Debut IF2\n"; push @res2,$val; print "\@res2 : @res2 impair\n"; print "Fin IF2\n"; } else { print "$val est hors limite!\n"; } print "----Fin foreach-----\n"; }Et le résultat
[root@localhost ~]# perl paire_impaire.pl ====Debut FOREACH==== 0 est hors limite! ----Fin foreach----- ====Debut FOREACH==== Debut IF2 @res2 : 1 impair Fin IF2 ----Fin foreach----- ====Debut FOREACH==== Debut IF1 @res1 : 2 pair Fin IF1 ----Fin foreach----- ====Debut FOREACH==== Debut IF2 @res2 : 1 3 impair Fin IF2 ----Fin foreach----- ====Debut FOREACH==== Debut IF1 @res1 : 2 4 pair Fin IF1 ----Fin foreach----- ====Debut FOREACH==== 5 est hors limite! ----Fin foreach----- ====Debut FOREACH==== 6 est hors limite! ----Fin foreach----- [root@localhost ~]#lami20j
J'ai continuer la batteries de tests et j'ai remarquéque si j'ajoute une virgule à la fin de chaque ligne de mon fichier, le programme se déroule bien sauf pour un mot d'àù je pense au problème d'accent
Amicalement Mathieu
Amicalement Mathieu
j'ai trouvé et réparé certaines erreurs donc je vous met le code en ligne pour avoir votre opinion
par contre lorsque j'aoute @res et @res2 un retour à la ligne apparait, est ce que ce retour à la ligne est automatique?
#!/usr/bin/perl use warnings; use strict; die "Usage : script syn_fr syn_all traduc_dierct resultat\n" if @ARGV != 4; my $syn = "./" . pop @ARGV; my $trad_direct="./" . pop @ARGV; my $dico_all="./" . pop @ARGV; my $dico_fr="./" . pop @ARGV; my %ved_syn_fr; my %ved_syn_all; my @ved_direct_fr_all; my @res=(); my @res2=(); my @resultat; open(DICO_FR,$dico_fr) || die ("Le fichier n'existe pas\n") ; while(<DICO_FR>){ my($verbe2,$liste_synonyme2) = split /:/,$_; $ved_syn_fr{$verbe2} = $liste_synonyme2; } close(DICO_FR); my @vedette_fr = keys %ved_syn_fr; open(DICO_ALL,$dico_all) || die ("Le fichier n'existe pas\n") ; while(<DICO_ALL>){ my ($verbe,$liste_synonyme)=split /:/,$_; $ved_syn_all{$verbe}=$liste_synonyme; #push @{$ved_syn_all{$verbe}},split /,/,$liste_synonyme; } close(DICO_ALL); my @vedette_all = keys %ved_syn_all; open(TRAD,$trad_direct) || die ("Le fichier n'existe pas\n"); while(<TRAD>){ my ($verbe, $liste)=split /:/,$_; my @eeee= split /,/,$liste; if(grep { /$verbe/ } @vedette_fr){ foreach my $var (@eeee){ print("\n$verbe , $var\n"); if((grep { /$var/ } @vedette_all) && (not($var eq ' ') )){ push(@res,$ved_syn_fr{$verbe}); push(@res2,$ved_syn_all{$var}); push(@resultat,$verbe,",",$var,":",@res,",",@res2); @res=(); @res2=(); } } } } close(TRAD); open SYN,">$syn" or die "E/S : $!"; print SYN @resultat and close SYN;
par contre lorsque j'aoute @res et @res2 un retour à la ligne apparait, est ce que ce retour à la ligne est automatique?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je pense avoir une idée du problème mais ce n'est pas sur
En gros je pense que je split mal mon fichier car il ne prend pas juste le dernier élément de ma liste
Et il y aussi peut-être un problème d'encodage pour certain terme ( à cause des accents) mais cela reste à vérifier
Je vais continuer les tests pour voir si les deux erreurs sont bien celle là.
Amicalement mathieu