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 :

manipulation de arrays


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 manipulation de arrays
    Bonjour,


    J'ai trois tableaux indexés :

    @nucleotides_array : T C T C A C T C T C G A C T G A C T G A C G A C T G
    @values_array : 12.33 13.53 13.49 0.51 14.22 25.58 12.89 13.04 11.81 0.72 11.23 0.94 13.44 1.26 45.99 0.55 13.29 1.31 1.48 25.08 2.19 13.20 0.50 11.85 11.45 11.14
    @unic_array : 11.14 11.23 11.45 11.81 11.85 12.33 12.89 13.04 13.2 13.29 13.44 13.49 13.53 14.22
    @nucleotides_array et @values_array contiennent 26 éléments associés 2 à 2 via leur indice. Donc $nucleotides_array[3] se rapporte à $values_array[3]. Je n'ai pas utilisé de hash car ces valeurs pourraient ne pas être uniques.

    @unic_array contient des éléments des éléments @values_array triés par ordre croissant. Je voudrais récupérer les nucléotides correspondants. Je pense utiliser des boucles ainsi que la fonction any du module List::MoreUtils. Est-ce une bonne idée, avez-vous une meilleure proposition d'algorithme?
    Le problème se posera si 2 mêmes valeurs existent et que les nucléotides qui leur sont associés sont différents. Je vais donc commencer par vérifier que les valeurs sont uniques et dans le cas contraire, j'afficherai un message.

    Merci,

  2. #2
    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 exemple
    J'ai vérifié et j'ai bien des valeurs communes dans @unic_array mais ce n'est pas un problème étant donné que le but est de compter le nombre de chaque nucléotide de @unic_array.


    Exemple :
    @nucleotides_array : T C T C A C T C T C G A C T G A C T G A C G A C T G
    @values_array : 1.83 1.98 1.60 0.51 1.93 3.65 1.74 0.36 0.30 0.38 1.81 0.45 0.54 1.70 1.77 0.28 1.83 1.51 1.73 1.83 0.37 1.57 0.31 1.74 0.52 0.39
    @unic_array : 1.51 1.57 1.6 1.7 1.73 1.74 1.74 1.77 1.81 1.83 1.83 1.83 1.93 1.98

    Merci, tout conseil est le bien venu.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    J'ai vérifié et j'ai bien des valeurs communes dans @unic_array mais ce n'est pas un problème étant donné que le but est de compter le nombre de chaque nucléotide de @unic_array.
    Je ne comprend pas en quoi ce n'est pas un problème ?
    Si tu as deux valeurs de nucléotides différentes (par exemple pour 1.74), lequel vas-tu compter ?

  4. #4
    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
    Citation Envoyé par Philou67430 Voir le message
    Je ne comprend pas en quoi ce n'est pas un problème ?
    Si tu as deux valeurs de nucléotides différentes (par exemple pour 1.74), lequel vas-tu compter ?
    Si pour mes valeurs 1.74 j'ai G ou C je compte donc 1 G et 1C.

    Donc pour mes 14 valeurs de @unic_array, j'aurai par exemple 5 G, 2 C, 4 A et 3 T (une somme de 14 nucléotides). Je dois trier les valeurs par nucléotides, j'ajouterai donc une fois 1.74 à l'array contenant les valeurs des G et une fois à celui des T. Le but ultime étant de calculer la valeur moyenne de A, de T, de C et de G.

    @val_A
    push @val_G, 1.74
    @val_T
    push @val_C, 1.74
    Ce dont je suis certaine c'est que les valeurs de @values_array qui ne se retrouvent pas dans @unic_array ne sont pas communes. Donc si j'ai une valeur doublon dans @unic_array, elle sera en double dans @values_array et jamais en triple. Est-ce clair?

    Je vais essayer en passant par un hash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    				# tableau %values_hash
    				# clé : valeur		valeur : le ou les nucléotides associés
    				my %values_hash;
    				for my $i (0..$#nucleotides_array){
    					push @{$values_hash{$values_array[$i]}}, $nucleotides_array[$i];
    				}
    Récupérer les valeurs de @unic_array et regarder le ou les nucléotides associés ... j'ai l'impression qu'il devrait y avoir plus élégant et plus simple comme méthode. Un grand merci pour ton aide.

  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
    Que penses-tu de cette façon de procéder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    				# tableau des valeurs de @unic_array sans doublons
    				my @treated_values = doublons_tranche(\@unic_array);
     
    				# récupération des indices correspondats dans @values_array
    				my @indices; 
     
    				for my $i (0..$#treated_values){
    					push @indices,indexes { $_ == $treated_values[$i] } @values_array;
    				}
    @treated_values : 1.51 1.57 1.93 1.77 1.83 1.73 1.6 1.81 1.74 1.98 1.7
    @indices : 17 21 4 14 0 16 19 18 2 10 6 23 1 13
    Maintenant que j'ai les indices, il suffit de regarder les nucléotides associés.

    Quelle est la différence entre indice et indexe? Lequel vaut-il mieux utiliser? Merci.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je crois avoir compris. J'essaye de retranscrire : à chaque valeur de @unic_array, tu prends le nucléotide de la première valeur correspondante dans @nucleotides_array, puis si tu rencontre à nouveau la même valeur, tu prends le nucléotide de la deuxième valeur correspondante dans @nucleotides_array, ainsi de suite s'il y en a d'autre. Donc pour le premier 1.74, tu sélectionnes le T, et pour le deuxième, tu sélectionnes le C. C'est bien ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @nucleotides_array = qw(T C T C A C T C T C G A C T G A C T G A C G A C T G);
    @values_array = qw(1.83 1.98 1.60 0.51 1.93 3.65 1.74 0.36 0.30 0.38 1.81 0.45 0.54 1.70 1.77 0.28 1.83 1.51 1.73 1.83 0.37 1.57 0.31 1.74 0.52 0.39);
    @unic_array = qw(1.51 1.57 1.6 1.7 1.73 1.74 1.74 1.77 1.81 1.83 1.83 1.83 1.93 1.98);

  7. #7
    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
    Citation Envoyé par Philou67430 Voir le message
    Donc pour le premier 1.74, tu sélectionnes le T, et pour le deuxième, tu sélectionnes le C. C'est bien ça ?
    Oui, c'est bien ça, j'ai trouvé une façon de procéder, je dois encore vérifier les valeurs :
    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
    				# tableau des valeurs de @unic_array sans doublons
    				my @treated_values = doublons_tranche(\@unic_array);
     
    				for my $i (0..$#treated_values){
     
    					# récupération des indices correspondants dans @values_array
    					my @indices = indexes { $_ == $treated_values[$i] } @values_array;
     
    					# recherche des nucléotides associés
    					foreach my $j (@indices){
     
    						if ($nucleotides_array[$j] eq 'A'){
    							push @val_A, $values_array[$j];
    						}
    						elsif ($nucleotides_array[$j] eq 'T'){
    							push @val_T, $values_array[$j];
    						}						
    						elsif ($nucleotides_array[$j] eq 'C'){
    							push @val_C, $values_array[$j];
    						}
    						elsif ($nucleotides_array[$j] eq 'G'){
    							push @val_G, $values_array[$j];
    						}						
    					}
    				}

  8. #8
    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
    Voila le résultat que j'obtiens avec le script plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @treated_values : 	1.51 1.57 1.93 1.77 1.83 1.73 1.6 1.74 1.81 1.98 1.7
    @val_A : 	1.93 1.83
    @val_T : 	1.51 1.83 1.60 1.74 1.70
    @val_C : 	1.83 1.74 1.98
    @val_G : 	1.57 1.77 1.73 1.81
    C'est bien ce que je voulais mais peut-être as-tu une autre façon de procéder.

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Une façon de procéder (qui retourne le nombre de chaque nucléotide, comme demandé initialement):
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use List::MoreUtils qw(pairwise);
     
    my @nucleotides_array = qw(T C T C A C T C T C G A C T G A C T G A C G A C T G);
    my @values_array = qw(1.83 1.98 1.60 0.51 1.93 3.65 1.74 0.36 0.30 0.38 1.81 0.45 0.54 1.70 1.77 0.28 1.83 1.51 1.73 1.83 0.37 1.57 0.31 1.74 0.52 0.39);
    my @unic_array = qw(1.51 1.57 1.6 1.7 1.73 1.74 1.74 1.77 1.81 1.83 1.83 1.83 1.93 1.98);
     
    # Get unique values (and the number of occurence for each one)
    my %unic_array;
    $unic_array{$_}++ foreach @unic_array;
     
    # Sort all nucleotides with their corresponding values
    my @nucleotides = sort { $a->[0] <=> $b->[0] } pairwise { [ $a => $b ] } @values_array, @nucleotides_array;
     
    # Count the number of nucleotide in the unic array
    my %count;
    $count{$_}++ foreach map {
      my $unic = $_;
      my @nucl = grep $_->[0] == $unic, @nucleotides;
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $_\n"
        if @nucl != $unic_array{$unic};
      map $_->[1], @nucl[0..$unic_array{$unic}-1]
    } keys %unic_array;
    print "$_: $count{$_}\n" foreach keys %count;

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Dans ce programme, j'ai introduit également (dans le hash %repart), la liste que tu as produite juste avant :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use List::MoreUtils qw(pairwise);
     
    my @nucleotides_array = qw(T C T C A C T C T C G A C T G A C T G A C G A C T G);
    my @values_array = qw(1.83 1.98 1.60 0.51 1.93 3.65 1.74 0.36 0.30 0.38 1.81 0.45 0.54 1.70 1.77 0.28 1.83 1.51 1.73 1.83 0.37 1.57 0.31 1.74 0.52 0.39);
    my @unic_array = qw(1.51 1.57 1.6 1.7 1.73 1.74 1.74 1.77 1.81 1.83 1.83 1.83 1.93 1.98);
     
    # Get unique values (and the number of occurence for each one)
    my %unic_array;
    $unic_array{$_}++ foreach @unic_array;
     
    # Sort all nucleotides with their corresponding values
    my @nucleotides = sort { $a->[0] <=> $b->[0] } pairwise { [ $a => $b ] } @values_array, @nucleotides_array;
     
    # Count the number of nucleotide in the unic array
    my %count;
    $count{$_}++ foreach map {
      my $unic = $_;
      my @nucl = grep $_->[0] == $unic, @nucleotides;
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $_\n"
        if @nucl != $unic_array{$unic};
      map $_->[1], @nucl[0..$unic_array{$unic}-1]
    } keys %unic_array;
    print "$_: $count{$_}\n" foreach keys %count;
     
    my %repart;
    foreach my $unic (keys %unic_array) {
      my @nucl = grep $_->[0] == $unic, @nucleotides;
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $_\n"
        if @nucl != $unic_array{$unic};
      push @{$repart{$_->[1]}}, $_->[0] foreach @nucl[0..$unic_array{$unic}-1]
    };
    print "$_: ", (join ", ", @{$repart{$_}}), "\n" foreach keys %repart;

  11. #11
    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
    Un grand merci pour ton aide, je vais essayer de comprendre tes codes et je poserai des questions si nécessaire

  12. #12
    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
    Je ne comprends pas la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @nucleotides = sort { $a->[0] <=> $b->[0] } pairwise { [ $a => $b ] } @values_array, @nucleotides_array;
    Je ne connaissais pas la fonction pairwise
    pairwise BLOCK ARRAY1 ARRAY2

    Evaluates BLOCK for each pair of elements in ARRAY1 and ARRAY2 and returns a new list consisting of BLOCK's return values. The two elements are set to $a and $b. Note that those two are aliases to the original value so changing them will modify the input arrays.
    Que signifie : [ $a => $b ] ?


    Merci,

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Crée une référence anonyme à une tableau dont le premier élément contient $a et le deuxième $b.
    J'ai utilisé la virgule faible comme opérateur de liste (=>) au lieu de , pour des raisons symboliques (pour faire référence au fait qu'on associe une valeur à un nucléotide.
    C'est strictement équivalent à
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @nucleotides = sort { $a->[0] <=> $b->[0] } pairwise { [ $a => $b ] } @values_array, @nucleotides_array;
    Permet de donc créer une liste fusionnée de @values_array et @nucléotides_array, dont chaque élément est une array contenant la valeur et le nucléotide correspondant. Cette table est ordonnée selon des valeurs croissantes. Je réalise après coup que l'usage du grep plus tard, ne nécessite pas de faire ce tri (je l'avais introduit parce que j'avais une autre idée d'algorithme qui n'était pas bonne).
    Tu peux donc supprimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort {$a->[0] <=> $b->[0] }
    ce qui allège encore le code.
    Désolé.

    PS : j'aime bien tes questions... ça demande un peu de réflexion.

  14. #14
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $_\n"
        if @nucl != $unic_array{$unic};
    C'est bien cette vérification, on ne sait jamais que ce ne soit plus le cas pour les futures données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @nucl = grep $_->[0] == $unic, @nucleotides;
    $unic contient donc une des clés (valeur numérique) de %unic_array et on récupère dans @nucl les nucléotides qui correspondent à cette valeur.
    Je pensais que @nucl était un tableau indexé simple mais ça ne semble pas le cas.


    J'ai du mal à comprendre cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map $_->[1], @nucl[0..$unic_array{$unic}-1]
    Je croyais qu'il fallait toujours des crochets avec la fonction map ^^.

    @nucl[0..$unic_array{$unic}-1] pourquoi ne pas simplement faire @nucl[0..$#nucl]?

    Ce dernier map renvoie la liste des nucléotides qui passent dans le foreach et sont comptés dans $count{$_}++

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @nucl = grep $_->[0] == $unic, @nucleotides;
    $unic contient donc une des clés (valeur numérique) de %unic_array et on récupère dans @nucl les nucléotides qui correspondent à cette valeur.
    Oui.
    Je pensais que @nucl était un tableau indexé simple mais ça ne semble pas le cas.
    Si, c'est un tableau indexé qui contient des références à des tableaux anonymes de 2 éléments chacun.
    On peut le voir comme un tableau à deux dimensions.
    J'ai du mal à comprendre cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map $_->[1], @nucl[0..$unic_array{$unic}-1]
    Je croyais qu'il fallait toujours des crochets avec la fonction map ^^.
    Non, ce n'est pas obligatoire (voir perldoc -f map). Si le traitement peut s'exprimer sous la forme d'une expression, on peut mettre directement l'expression (dans ce cas, il faut mettre une virgule pour séparer l'expression de l'opérande liste.
    @nucl[0..$unic_array{$unic}-1] pourquoi ne pas simplement faire @nucl[0..$#nucl]?
    Parce que si le nombre de nucléotide dans @nucleotides_array est plus important, on se limite toujours au nombre que l'on a trouvé dans %unic_array.
    Ce dernier map renvoie la liste des nucléotides qui passent dans le foreach et sont comptés dans $count{$_}++
    Oui.

  16. #16
    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
    Citation Envoyé par Philou67430 Voir le message
    Oui.Si, c'est un tableau indexé qui contient des références à des tableaux anonymes de 2 éléments chacun.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @nucl = grep $_->[0] == $unic, @nucleotides;
    J'ai compris, c'est un sous tableau de @nucleotides, je pensais qu'on ne récupérait que $_->[0] mais non, le grep renvoie les tableaus anonymes de 2 valeurs de @nucleotides et pas seulement la première valeur de ceux-ci.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parce que si le nombre de nucléotide dans @nucleotides_array est plus important, on se limite toujours au nombre que l'on a trouvé dans %unic_array.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map $_->[1], @nucl[0..$unic_array{$unic}-1]
    oui mais @nucl est déjà un sous-groupe de @nucleotides_array et ne contient que les valeurs des clés de %unic_array.

    Vu qu'on ne rentre jamais dans le if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $_\n"
        if @nucl != $unic_array{$unic};
    cela prouve bien que $#nucl == $unic_array{$unic}-1 et on pourrait donc écrire @nucl[0..$#nucl] au lieu de @nucl[0..$unic_array{$unic}-1]
    ... si ce n'est pas le cas, c'est qu'il y a encore quelque chose qui m'échappe


    Cela devient plus clair, j'aime bien demander tes conseils car j'apprends toujours plein de choses. L'ennui c'est que c'est fort complexe pour moi et que je n'arriverai pas à tout intégrer dans mon cerveau en une fois.

  17. #17
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map $_->[1], @nucl[0..$unic_array{$unic}-1]
    oui mais @nucl est déjà un sous-groupe de @nucleotides_array et ne contient que les valeurs des clés de %unic_array.

    Vu qu'on ne rentre jamais dans le if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $_\n"
        if @nucl != $unic_array{$unic};
    cela prouve bien que $#nucl == $unic_array{$unic}-1 et on pourrait donc écrire @nucl[0..$#nucl] au lieu de @nucl[0..$unic_array{$unic}-1]
    ... si ce n'est pas le cas, c'est qu'il y a encore quelque chose qui m'échappe
    On ne rentre pas dans le if avec ton exemple. Mais avec un autre exemple, cela pourrait arriver.
    Dans ce cas, on se limiterais toujours au nombre de nucléotide dans @uniq_array (le warn ne stoppe pas le programme, il ne fait qu'afficher une warning).

  18. #18
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Petit bug dans le script (mis en évidence en supprimant un doublon dans @unic_array) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $_\n"
    à remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      warn "Number of nucleotide in nucleotide array is greater than in the unic array for value $unic\n"

  19. #19
    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
    On ne rentre pas dans le if avec ton exemple. Mais avec un autre exemple, cela pourrait arriver.
    Dans ce cas, on se limiterais toujours au nombre de nucléotide dans @uniq_array (le warn ne stoppe pas le programme, il ne fait qu'afficher une warning).
    Ok, merci. J'ai compris. Si jamais on rentre dans le if, je ne continuerai pas le programme car je ne saurais pas quels nucléotides récupérer de @nucléotides_array, il ne faut pas spécialement récupérer les premiers. Normalement, ce cas ne devrait pas arriver et sur les 40 séries de valeurs que je devais tester, ce n'est pas arriver.

    Un super grand merci pour ton aide et bonne fin de semaine.

  20. #20
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    OK. Ne sachant pas comment traiter les cas atypiques, j'ai pris l'option de continuer malgré tout avec un fonctionnement par défaut.
    J'ai appris à considérer que les données bio étaient peu normalisées, et rarement exemptes d'erreurs.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [PL/PGSQL][9.2] manipuler un ARRAY
    Par CosmoKnacki dans le forum Requêtes
    Réponses: 0
    Dernier message: 04/12/2012, 13h59
  2. Comment bien manipuler les array multidimensionnel
    Par pierrot10 dans le forum Langage
    Réponses: 1
    Dernier message: 25/02/2012, 22h10
  3. [PHP 5.3] Besoin d'aide pour la manipulation des array
    Par pierrot10 dans le forum Langage
    Réponses: 1
    Dernier message: 12/05/2011, 00h26
  4. Boucle Foreach et manipulation d'array
    Par rom1dvp dans le forum Langage
    Réponses: 5
    Dernier message: 12/03/2011, 04h45
  5. manipulation d'arrays recherche de valeurs
    Par Jasmine80 dans le forum Langage
    Réponses: 4
    Dernier message: 08/02/2007, 09h51

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