[perl] données qui n'est pas prise en compte [Fermé]

Signaler
-
 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
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

6 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,

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
2
Merci

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

CCM 65492 internautes nous ont dit merci ce mois-ci

C'est exact on sait déjà vu

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
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
j'ai trouvé et réparé certaines erreurs donc je vous met le code en ligne pour avoir votre opinion

#!/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?
heu pourquoi tu dit que tu donne ton compte dofus ya pas tes donner de dofus
ece que vous pouvez donnez votre compte dofus svp?
sai pour savoir si quelun pourrai me odnner son compt et code dofus