IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bioinformatique Perl Discussion :

Hachage et boucle while problème de reconnaissance de clef


Sujet :

Bioinformatique Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Par défaut Hachage et boucle while problème de reconnaissance de clef
    Bonjour,
    Je rencontre un problème avec le script suivant: les valeurs s'accumulent sur la même clef au lieu de se repartir sur les trois différentes que j'essaie de créer.
    Il semble qu'à la ligne 45 le code ne reconnait pas $code qui est pourtant créer plus tôt dans la boucle while.
    Est- ce que quelqu'un est en mesure de m'aider?
    Merci!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
    #essai1 pour exercice 10
    use warnings;
    use strict;
    use Data::Dumper;
     
    my $file = 'file.fas'; # attribuer à la variable file la premiere lifne du fichier 
    open(IN, $file); # ouvrir le fichier
     
    my %seq = (); #declarer la variable hachage seq
     
    my $code; #declarer la variable code
     
    my @data = <IN>; #on declare la variable liste @data et on lui associe le ficher ouvert
     
    close IN;
     
    print 'deuxieme ligne:' , "$data[1]\n"; 
    print 'derniere ligne:' , "$data[-1]\n";
    my $vari = scalar @data;
    print 'nombre de lignes:' , "$vari\n";
     
    my $var; #declarer la variable var
    while($var= shift @data)#on enleve le premier element de la liste data et on l'attribue à $var
    {
    	if($var =~ />/)
    		{
    			chomp $var; #elimination du saut à la ligne
    			$var=~ s/\>//g; #elimination du signe >
    			my $code = $var; #association de l'indentifiant de la séquence à la variable code
    			$seq{$code} = ''; # l'indentifiant code est la clé du hachage
    			print 'code:' , "$code\n";
    			print 'hachage identifiants : ';
    			print Dumper (\%seq);
    			print "\n";	
    		}
    	else
    		{
    			chomp $var; #enlever le saut à la ligne de la ligne
    			$var = uc $var; #mettre tous les caractères en majuscule
    			$var =~ s/[^ATCG]/N/g; #substituer tout ce qui n'est pas ATCG par N
    			$var =~ s///;  #eliminer les espaces inutiles
    			print 'var: ' , "$var\n";
    			my $val= $var;
    			# need une ligne pour dire que si le code change 
    			#la valeur va au nouveau code
    			$seq{$code} .= $val; #le point nous permet d'ajouter val à la fin de la valeur
    			print 'hachage avant fin boucle : ';
    			print Dumper (\%seq);
    			print "\n";
    		}
    }
     
    # les problemes sont les suivants:
    # la valeur passe d'une clé à l'autre parce qu'à l45 il ne reconnait
    # pas $code 
     
     
    print 'hachage : ';
    print Dumper (\%seq);
    print "\n";
     
    close IN;
    exit;

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    il faudrait que tu montres un exemple de ton fichier en entrée pour mieux comprendre ce que tu cherches à faire avec ton programme.

    Cela dit, le problème est sans doute que tu déclares $code à l'intérieur de la boucle while, ce qui fait qu'à une autre itération dans cette boucle, la valeur qui a été donnée à $code est perdue.

    Il faudrait que tu déclares $code (avec une instruction de type "my $code;") avant d'entrer dans la boucle, et que enlèves le "my" dans la ligne affectant une valeur à $code dans le if.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # ...
    my $var; #declarer la variable var
    my $code;
    while($var= shift @data)#on enleve le premier element de la liste data et on l'attribue à $var
    {
    	if($var =~ />/)
    		{
    			#...
    			$code = $var; #association de l'indentifiant de la séquence à la variable code
    			# ...
    		}
    	else
    		{
    			# ...
    			$seq{$code} .= $val; #le point nous permet d'ajouter val à la fin de la valeur
    			# ...
    		}
    }
    J'ajouterais un commentaire n'ayant pas à voir avec ton problème. Cette ligne de code ouvrant un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open(IN, $file); # ouvrir le fichier
    utilise une syntaxe obsolète et critiquée (même si elle fonctionne encore). Les "bonnes pratiques" communément admises consistent à utiliser un file handle lexical, employer une syntaxe à trois arguments et vérifier si l'appel système a réussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open my $IN, "<", $file or die "Ouverture impossible de $file $!";
    Cela implique bien sûr de remplacer "IN" par "$IN" dans le reste du programme.

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonjour,

    il faudrait que tu montres un exemple de ton fichier en entrée pour mieux comprendre ce que tu cherches à faire avec ton programme.

    Cela dit, le problème est sans doute que tu déclares $code à l'intérieur de la boucle while, ce qui fait qu'à une autre itération dans cette boucle, la valeur qui a été donnée à $code est perdue.

    Il faudrait que tu déclares $code (avec une instruction de type "my $code;") avant d'entrer dans la boucle, et que enlèves le "my" dans la ligne affectant une valeur à $code dans le if.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # ...
    my $var; #declarer la variable var
    my $code;
    while($var= shift @data)#on enleve le premier element de la liste data et on l'attribue à $var
    {
    	if($var =~ />/)
    		{
    			#...
    			$code = $var; #association de l'indentifiant de la séquence à la variable code
    			# ...
    		}
    	else
    		{
    			# ...
    			$seq{$code} .= $val; #le point nous permet d'ajouter val à la fin de la valeur
    			# ...
    		}
    }
    J'ajouterais un commentaire n'ayant pas à voir avec ton problème. Cette ligne de code ouvrant un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open(IN, $file); # ouvrir le fichier
    utilise une syntaxe obsolète et critiquée (même si elle fonctionne encore). Les "bonnes pratiques" communément admises consistent à utiliser un file handle lexical, employer une syntaxe à trois arguments et vérifier si l'appel système a réussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open my $IN, "<", $file or die "Ouverture impossible de $file $!";
    Cela implique bien sûr de remplacer "IN" par "$IN" dans le reste du programme.
    Merci beaucoup! Pour l'ouverture du fichier et pour la résolution du problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] Double boucles while, problème d'accès au données de la première
    Par beegees dans le forum Langage
    Réponses: 3
    Dernier message: 09/11/2009, 08h44
  2. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11
  3. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11
  4. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  5. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo