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

Langage Perl Discussion :

hash de array


Sujet :

Langage Perl

  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut hash de array
    Bonjour,


    %liste_acc est un hash de array.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach my $name ( keys %liste_acc ){
     
    	if ($#{$liste_acc{$name}} > 0){
     
    	}
    pourquoi ce code renvoie-t-il une erreur?

    Global symbol "@liste_acc" requires explicit package name at GB_AccFile_to_FastaFile_boucle.pl line 77.

    Merci,

  2. #2
    Inactif  
    Profil pro
    " "
    Inscrit en
    Janvier 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : " "

    Informations forums :
    Inscription : Janvier 2008
    Messages : 330
    Par défaut
    est ce que c'est pas plutôt un problème de visibilité de variable, c'est à dire que tu chercher à utiliser une variable qui n'est pas globale dans une fonction où elle n'est pas definei???

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci, mais non, ce n'est pas ça. Mon tableau est déclaré en début de script avant toute entrée dans un bloc.

    Voici le script qui fonctionne
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #!/usr/bin/perl
     
     
    use strict;
    use warnings;
     
    use Bio::DB::GenBank;
    use FileHandle;
     
     
    #----------------------------- Programme GB_AccFile_to_FastaFile_boucle.pl:
     
     
     
     
     
    my $rep = 'P:/Theorie/Driss/GB_consensus';
     
    my $data_file = FileHandle->new ('>'.$rep.'/GB_data2.txt');
    my $all_seq_file = FileHandle->new ('>'.$rep.'/all_seq2.txt');
     
    my $gb = new Bio::DB::GenBank;
     
     
    open my $in_file_fh, '<', $rep.'/sequences2/data.txt' or die;
     
     
    my (%liste_acc, %liste_seq );
     
     
     
    =h
     
    structure des 2 hashes
    -----------------------
     
    my %liste_acc = ( 
    			'39S_ribosomal_protein_L52' => ['NM_178336', 'NM_180982', 'NM_181304', 'NM_181305', 'NM_181306', 'NM_181307'],
    			'ADP-ribosylation_factor-like_protein_1' => ['NM_001177'],
    			'fibronectin_isoform_3_preproprotein' => ['NM_002026', 'NM_054034', 'NM_212474', 'NM_212475', 'NM_212476', 'NM_212478', 'NM_212482'],
    			'EIF2A' => ['NM_032025'],
    );
     
     
    my %liste_seq = ( 
    			'39S_ribosomal_protein_L52' => 'agtggcgactacagcagggactg..caataaa',
    			'ADP-ribosylation_factor-like_protein_1' => 'ctttccaaagattagactcagtatgagagtaggtgaggaacatagtttgtgtaa..tactat',
    			'fibronectin_isoform_3_preproprotein' => 'gaacgacacattccacaagcgtcatgaag..accac',
    );
    =cut
     
     
     
    while (my $line = <$in_file_fh> ){
     
    	my ($name, $target_seq, $acc) = split (/\s*\t\s*/, $line);
     
    	$name =~ s/^\s//;
    	$name =~ s/\s/_/g;
    	$name =~ s/[^-\w]/_/g;
     
    	push (@{$liste_acc{$name}}, $acc);
    	$liste_seq{$name} = $target_seq;
     
    }
     
    close $in_file_fh;
     
     
     
     
     
    foreach my $name ( keys %liste_acc ){
     
    	my $seq_file = FileHandle->new ('>'.$rep.'/'.$name.'.txt');
     
    	print $seq_file ">${name}_RefSeq\n$liste_seq{$name}\n";
     
    	foreach my $acc ( @{$liste_acc{$name}} ){
     
    		eval { $gb->get_Seq_by_acc($acc) };
     
    		if ($@) {
    			print "ERREUR $acc ($name)\n";
    		}
     
    		else{
     
    			my $info = $gb->get_Seq_by_acc($acc);    
    			my $description = $info->desc();  
    			my $seq = $info->seq();  
     
    			print $data_file "$name\t$acc\t$description\n";
    			print $seq_file ">$acc\n$seq\n";
    			print $all_seq_file ">${name}_$acc\n$seq\n";
    		}
     
    	}
     
    }
    Je voudrais que la ligne 77 ne s’exécute que si @{$liste_acc{$name}} contienne plus d'un élément

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Par défaut
    Ce devrait pourtant fonctionner.
    As-tu d'autres erreurs ?

    Pourrais-tu donner le code exact que tu as tenté de compiler ?

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Ah oui, c'est étrange, aujourd'hui ça fonctionne : voici le code qui me posait l'erreur :

    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
    foreach my $name ( keys %liste_acc ){
     
    	my $seq_file = FileHandle->new ('>'.$rep.'/'.$name.'.txt');
     
     
     
    	if ($#{$liste_acc{$name}} > 0){
    		print $seq_file ">${name}_RefSeq\n$liste_seq{$name}\n";
    	}
     
    =h
    	foreach my $acc ( @{$liste_acc{$name}} ){
     
    		eval { $gb->get_Seq_by_acc($acc) };
     
    		if ($@) {
    			print "ERREUR $acc ($name)\n";
    		}
     
    		else{
     
    			my $info = $gb->get_Seq_by_acc($acc);    
    			my $description = $info->desc();  
    			my $seq = $info->seq();  
     
    			print $data_file "$name\t$acc\t$description\n";
    			print $seq_file ">$acc\n$seq\n";
    			print $all_seq_file ">${name}_$acc\n$seq\n";
    		}
     
    	}
    =cut
    }
    ... peut-être avais-je une parenthèse ouvrante ou fermante ou un point-virgule trainant dans le bas du script car j'avais utiliser (=h/=cut) provisoirement dans le but de vérifier le bloc if ($#{$liste_acc{$name}} > 0){...} sans que la suite (qui prend du temps) ne s'exécute. Je pensais que l'erreur venait du if vu le message de l'éditeur (Global symbol "@liste_acc" requires explicit package name at GB_AccFile_to_FastaFile_boucle.pl line 77. )

    Bref, merci à ceux qui ont essayé de m'aider.

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

Discussions similaires

  1. Perl hash => Php array: Module existant?
    Par ssc37 dans le forum Langage
    Réponses: 1
    Dernier message: 10/12/2009, 13h18
  2. Réponses: 1
    Dernier message: 25/02/2009, 22h05
  3. Souci entre hash et array
    Par Biiru dans le forum Langage
    Réponses: 1
    Dernier message: 01/05/2007, 18h27
  4. [D7] Tableau associatif (hash, associative array)?
    Par fredtheman dans le forum Delphi
    Réponses: 3
    Dernier message: 21/06/2006, 18h42
  5. [HASH de HASH de ARRAY]
    Par antigone dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2005, 18h01

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