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 hash


Sujet :

Langage Perl

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    D'accord, merci de me prévenir. Il n'y a rien d'urgent ... c'est juste pour améliorer mes connaissances pendant mes temps morts ... ne te prends pas trop la tête si c'est compliqué.
    Là, j'ai commencé à apprendre Java. J'ai du pain sur la planche !

    Bon weekend et à lundi.
    -- Jasmine --

  2. #22
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    J'ai la version 5.18.2 de Strawberry. J'ai installé WWW::Mechanize::Query (cpan). La seule erreur que j'ai obtenue est l'absence du module Regexp::Common.
    Après l'avoir installé (cpan), la ré-installation de WWW::Mechanize::Query s'est faite sans encombre.
    Il me reste à tester le script.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #23
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour l'instant, j'ai encore l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't locate object method "attr" via package "Mojo::Collection" at Mechanize_Query.pl line 40.
    (que je n'ai pas sous Cygwin).

    Pour ton autre erreur, essaye un upgrade de LWP::UserAgent
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    J'ai la version 5.18.2 de Strawberry. J'ai installé WWW::Mechanize::Query (cpan). La seule erreur que j'ai obtenue est l'absence du module Regexp::Common.
    Après l'avoir installé (cpan), la ré-installation de WWW::Mechanize::Query s'est faite sans encombre.
    Il me reste à tester le script.
    Oui, c'est exactement ce que j'ai eu à faire.


    Citation Envoyé par Philou67430 Voir le message
    Can't locate object method "attr" via package "Mojo::Collection" at Mechanize_Query.pl line 40.
    J'ai une remarque suplémentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Unrecognized LWP::UserAgent options: -ignore_cache at (eval 52) line 56.
    Can't locate object method "attr" via package "Mojo::Collection" at Mechanize_Query.pl line 40.
    Merci beaucoup d'essayer autant de m'aider.
    -- Jasmine --

  5. #25
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour la remarque sur LWP::UserAgent, tente un upgrade (cpan) de LWP::UserAgent et de WWW::Mechanize::Cached
    Pour l'autre erreur, je n'arrive pas à comprendre. Initialement, sous Cygwin, j'avais aussi cette erreur, mais les upgrades de /WWW::Mechanize/ avait résolus le problème.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #26
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Bon, j'ai une piste (mais pas bonne).

    Sous Cygwin, j'avais une version du Bundle "Mojolicious" en 5.08, et sur Strawberry en version 6.11 (malgré l'upgrade de Mojo::DOM qui en dépend).
    J'ai mis à jour Mojolicious sous Cygwin, et maintenant, j'ai la même erreur sous Cygwin que sous Strawberry (ce qui ne me plait pas).
    Il apparait donc que le script "doit" être corrigé.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #27
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Le script corrigé :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    use WWW::Mechanize::Query;
    #use Mojo::DOM;
     
    sub analyse_study($) {
      my ($study) = @_;
     
      local $/ = "\r\n";
     
      my @cols = ("Factor Value[Compound]", "Characteristics[StdInChIKey]");
      open my $STUDY, "<", \$study;
      my ($header, %header) = (0);
      if (defined(my $h = <$STUDY>)) {
        $header{$_} = $header++ foreach map { chomp ; $_ } split /\t/, $h;
        my %std_in_chi_key;
        foreach my $line (<$STUDY>) {
          chomp($line);
          my ($compound, $std_in_chi_key) = (split /\t/, $line)[@header{@cols}];
          push @{$std_in_chi_key{$compound}}, $std_in_chi_key;
          #say "Compound=$compound std_in_chi_key=$std_in_chi_key";
        }
        if (my @duplicated = grep @{$std_in_chi_key{$_}}>1, keys %std_in_chi_key) {
          say "The following Compound have several StdInChiKeys:\n",
            join "\n", map { "  $_: @{$std_in_chi_key{$_}}" } @duplicated;
        }
      }
    }
     
    my $mech = WWW::Mechanize::Query->new(-ignore_cache => 1);
     
    my $ftp_root = "ftp://ftp.ebi.ac.uk/pub/databases/microarray/data/dixa/NTC/archive/";
    $mech->add_header("Accept" => "text/html");
    $mech->get($ftp_root);
    if ($mech->success()) {
      #my $root_dir = $mech->dom; #Mojo::DOM->new($mech->content);
      foreach my $dir_url ($mech->find("a")->map(sub { $_->attr("href")})->each) {
        say "Looking in $dir_url";
        $mech->get("$ftp_root/$dir_url/s_Study.txt");
        analyse_study($mech->content);
      }
    } else {
      die "Can't access to $ftp_root\n";
    }
    Il semble que la méthode attr ne soit plus supportée par un objet Mojo::Collection (ce qui était le cas dans Mojolicious v5.08).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour Philou,

    Je te remercie pour ta persévérance ce script fonctionne maintenant.

    J'ai toujours l'erreur 'Unrecognized LWP::UserAgent options: -ignore_cache at (eval 52) line 56.' mais ensuite, il affiche bien pour chaque répertoire 'Looking in NTC_WPxxx'.
    Je n'ai aucune erreur d'StdInChiKeys dupliquées, en as-tu chez toi ?

    Pourrais-tu m'expliquer ces quelques lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mech->add_header("Accept" => "text/html");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      foreach my $dir_url ($mech->find("a")->map(sub { $_->attr("href")})->each) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    analyse_study($mech->content);
    ... il est cool 'say', je vais abandonner le 'print'
    Je vais continuer d'essayer de comprendre, ce script me semble très dense ... je n'aurais jamais pu l'écrire seule, j'ai déjà du mal à le comprendre, donc encore merci pour ton aide.

    Bonne après-midi,
    -- Jasmine --

  9. #29
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Bonjour Philou,

    Je te remercie pour ta persévérance ce script fonctionne maintenant.

    J'ai toujours l'erreur 'Unrecognized LWP::UserAgent options: -ignore_cache at (eval 52) line 56.' mais ensuite, il affiche bien pour chaque répertoire 'Looking in NTC_WPxxx'.
    Tu n'as peut-être pas la même version de LWP::UserAgent que moi... néanmoins, cette option n'est peut-être pas nécessaire.
    Je n'ai aucune erreur d'StdInChiKeys dupliquées, en as-tu chez toi ?
    De mémoire non, mais je crois que je n'ai jamais laisser tourner le script jusqu'à la fin non plus.
    Pourrais-tu m'expliquer ces quelques lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mech->add_header("Accept" => "text/html");
    Par défaut, quand tu demandes un "répertoire ftp" et non une page HTML, le serveur retourne un type MIME text/directory (si je ne fais pas erreur). Or, comme je voulais utiliser un selecteur de DOM, il me fallait une réponse de type HTML de la part du serveur FTP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      foreach my $dir_url ($mech->find("a")->map(sub { $_->attr("href")})->each) {
    la méthode "find" est un sélecteur css pour un DOM. C'est l'équivalent de jQuery en programmation web. Ici, je sélectionne dans la page retournée par le serveur FTP (la liste des fichiers du dossier), toutes les balises A (les liens) à l'aide de la méthode find (perldoc Mojo:OM), et pour chacune, je récupère l'attribut href (méthode map). Au final, la méthode each permet de retourner le résultat sous forme d'un tableau perl que je peux parcourir avec foreach.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    analyse_study($mech->content);
    Qu'est ce que tu ne comprends pas ? l'appel à analyse_study permet l'analyse des fichiers study. Ceux-ci ont été récupéré par l'object $mech (WWW::Mechanize) grâce à la méthode get. Pour obtenir le contenu de la réponse du serveur (le résultat de get), il convient d'utiliser la méthode content qui retourne la page HTML récupérée (ou le fichier) à partir de l'url de la méthode get.


    ... il est cool 'say', je vais abandonner le 'print'
    Je vais continuer d'essayer de comprendre, ce script me semble très dense ... je n'aurais jamais pu l'écrire seule, j'ai déjà du mal à le comprendre, donc encore merci pour ton aide.
    N'hésite pas à poser des questions. Demain, je ne suis pas là, mais je reviendrai.
    Ciao.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour Philou,

    J'ai bien relu le script et grace à tes explications, j'en ai compris le fonctionnement.
    J'ai une dernière question, est-il possible, par erreur d'avoir accès à ces fichiers et de les écraser, les modifier ... Mechanize::Query, permet-il également l'écriture de fichiers ?

    Merci beaucoup,

    Jasmine.
    -- Jasmine --

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Le script fonctionne, mais ne fait pas ce que je veux :
    Looking in NTC_WP1.1.1_E01
    The following Compound have several StdInChiKeys:
    Cisplatin: LXZZYRPGZAFOLE-UHFFFAOYSA-L LXZZYRPGZAFOLE-UHFFFAOYSA-L
    Les 2 StdInChiKeys étant identiques, je ne dois pas avoir d'erreur. J'y regarde de plus près.
    -- Jasmine --

  12. #32
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Bonjour Philou,

    J'ai bien relu le script et grace à tes explications, j'en ai compris le fonctionnement.
    J'ai une dernière question, est-il possible, par erreur d'avoir accès à ces fichiers et de les écraser, les modifier ... Mechanize::Query, permet-il également l'écriture de fichiers ?

    Merci beaucoup,

    Jasmine.
    Tu peux écrire des fichiers sur le système de fichier local, mais pas directement sur un serveur HTTP bien sur.
    Mais je ne suis pas sûr de bien comprendre ta question.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Tu peux écrire des fichiers sur le système de fichier local, mais pas directement sur un serveur HTTP bien sur.
    Mais je ne suis pas sûr de bien comprendre ta question.
    Je n'ai jamais travaillé sur des fichiers en http avant, je découvre. Mon IP est autorisé à avoir l'accès aux fichiers sur ce serveur et de les modifier, mais donc, en me connectant en HTTP, je ne peux que les lire. Si, j'ai bien compris.
    -- Jasmine --

  14. #34
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Le script fonctionne, mais ne fait pas ce que je veux :

    Les 2 StdInChiKeys étant identiques, je ne dois pas avoir d'erreur. J'y regarde de plus près.
    J'ai relu le début de la discussion et je pense avoir, comme Lolo, fais une erreur de lecteur dans ta question : la dernière solution de lolo me semble donc plutôt bien adaptée.

    Ça donne ça sur le script que je t'avais proposé avec WWW::Mechanize :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    use WWW::Mechanize::Query;
    #use Mojo::DOM;
     
    sub analyse_study($) {
      my ($study) = @_;
     
      local $/ = "\r\n";
     
      my @cols = ("Factor Value[Compound]", "Characteristics[StdInChIKey]");
      open my $STUDY, "<", \$study;
      my ($header, %header) = (0);
      if (defined(my $h = <$STUDY>)) {
        $header{$_} = $header++ foreach map { chomp ; $_ } split /\t/, $h;
        my %std_in_chi_key;
        foreach my $line (<$STUDY>) {
          chomp($line);
          my ($compound, $std_in_chi_key) = (split /\t/, $line)[@header{@cols}];
          push @{$std_in_chi_key{$compound}}, $std_in_chi_key
            if !exists $std_in_chi_key{$compound} || !grep $std_in_chi_key eq $_, @{$std_in_chi_key{$compound}};
          #say "Compound=$compound std_in_chi_key=$std_in_chi_key";
        }
        if (my @duplicated = grep @{$std_in_chi_key{$_}}>1, keys %std_in_chi_key) {
          say "The following Compound have several StdInChiKeys:\n",
            join "\n", map { "  $_: @{$std_in_chi_key{$_}}" } @duplicated;
        }
      }
    }
     
    my $mech = WWW::Mechanize::Query->new(-ignore_cache => 1);
     
    my $ftp_root = "ftp://ftp.ebi.ac.uk/pub/databases/microarray/data/dixa/NTC/archive/";
    $mech->add_header("Accept" => "text/html");
    $mech->get($ftp_root);
    if ($mech->success()) {
      #my $root_dir = $mech->dom; #Mojo::DOM->new($mech->content);
      foreach my $dir_url ($mech->find("a")->map(sub { $_->attr("href")})->each) {
        say "Looking in $dir_url";
        $mech->get("$ftp_root/$dir_url/s_Study.txt");
        analyse_study($mech->content);
      }
    } else {
      die "Can't access to $ftp_root\n";
    }
    J'ai laissé tourner sur tous les fichiers et il n'y a pas d'erreur de détectées. Par contre, en désactivant le commentaire de la ligne 26, je m'aperçois que la première ligne de chaque fichier devrait être ignorée (ce n'est pas grave en soit, ça ne génère pas d'erreur ni de mauvais traitement).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Voila ce que mon code donne maintenant :

    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
    sub analyse_study($) {
      my ($study) = @_;
     
      local $/ = "\r\n";
     
      my @cols = ("Factor Value[Compound]", "Characteristics[StdInChIKey]");
      open my $STUDY, "<", \$study;
      my ($header, %header) = (0);
     
      if (defined(my $h = <$STUDY>)) {
        $header{$_} = $header++ foreach map { chomp ; $_ } split /\t/, $h;
        my %std_in_chi_key;
     
        foreach my $line (<$STUDY>) {
          chomp($line);
          my ($compound, $std_in_chi_key) = (split /\t/, $line)[@header{@cols}];
          push @{$std_in_chi_key{$compound}}, $std_in_chi_key;
          #say "Compound=$compound std_in_chi_key=$std_in_chi_key";
        }
     
        foreach my $compound (keys %std_in_chi_key){
    	my %diff_std_in_chi_key_count;
     
    	foreach my $v (@{$std_in_chi_key{$compound}}){ 
    		$diff_std_in_chi_key_count{$v}=1;
    	}	   
     
    	my @diif_std_in_chi_key = keys (%diff_std_in_chi_key_count);
     
    	if ( int(@diif_std_in_chi_key) > 1){
    		say "The following Compound have several StdInChiKeys:\n".$compound."\t".join (',', @diif_std_in_chi_key);
    	}
        }
    =h  
        if (my @duplicated = grep @{$std_in_chi_key{$_}}>1, keys %std_in_chi_key) {
          say "The following Compound have several StdInChiKeys:\n",
            join "\n", map { "  $_: @{$std_in_chi_key{$_}}" } @duplicated;
        }
    =cut
      }
    }
    Pour chaque compound, je vérifie qu'un seul InChiKey existe (sous-entendant, une seule valeur de référence). Je peux avoir plusieurs fois le même InChiKey répété. Vu que j'ai corrigé toutes les erreurs des fichiers, je ne passe plus jamais dans le 'if' pour vérifier si il fonctionne, mais je pense que c'est correct. Je n'ai plus besoin de ce script, c'était pour le fun et pour apprendre. Merci pour ton aide.
    -- Jasmine --

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Ça donne ça sur le script que je t'avais proposé avec WWW::Mechanize :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    use WWW::Mechanize::Query;
    #use Mojo::DOM;
     
    sub analyse_study($) {
      my ($study) = @_;
     
      local $/ = "\r\n";
     
      my @cols = ("Factor Value[Compound]", "Characteristics[StdInChIKey]");
      open my $STUDY, "<", \$study;
      my ($header, %header) = (0);
      if (defined(my $h = <$STUDY>)) {
        $header{$_} = $header++ foreach map { chomp ; $_ } split /\t/, $h;
        my %std_in_chi_key;
        foreach my $line (<$STUDY>) {
          chomp($line);
          my ($compound, $std_in_chi_key) = (split /\t/, $line)[@header{@cols}];
          push @{$std_in_chi_key{$compound}}, $std_in_chi_key
            if !exists $std_in_chi_key{$compound} || !grep $std_in_chi_key eq $_, @{$std_in_chi_key{$compound}};
          #say "Compound=$compound std_in_chi_key=$std_in_chi_key";
        }
        if (my @duplicated = grep @{$std_in_chi_key{$_}}>1, keys %std_in_chi_key) {
          say "The following Compound have several StdInChiKeys:\n",
            join "\n", map { "  $_: @{$std_in_chi_key{$_}}" } @duplicated;
        }
      }
    }
     
    my $mech = WWW::Mechanize::Query->new(-ignore_cache => 1);
     
    my $ftp_root = "ftp://ftp.ebi.ac.uk/pub/databases/microarray/data/dixa/NTC/archive/";
    $mech->add_header("Accept" => "text/html");
    $mech->get($ftp_root);
    if ($mech->success()) {
      #my $root_dir = $mech->dom; #Mojo::DOM->new($mech->content);
      foreach my $dir_url ($mech->find("a")->map(sub { $_->attr("href")})->each) {
        say "Looking in $dir_url";
        $mech->get("$ftp_root/$dir_url/s_Study.txt");
        analyse_study($mech->content);
      }
    } else {
      die "Can't access to $ftp_root\n";
    }
    Oui, merci beaucoup, il fonctionne maintenant et est vaiment très concis, je vais me concentrer pour coder avec ce style
    -- Jasmine --

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je ne comprends pas cette écriture
    Tu cherches les index des 2 clés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @header{"Factor Value[Compound]", "Characteristics[StdInChIKey]"}
    Pourquou @ avec {} ?

    Ca doit être l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($header{"Factor Value[Compound]"}, $header{"Characteristics[StdInChIKey]"})
    C'est la première fois que je vois ça
    -- Jasmine --

  18. #38
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Il faut toujours se souvenir que le sigil (le caractère $, @ ou %) que l'on place devant un symbole représente le type perl (scalaire, array ou hash) retourné par l'expression.
    Dans le cas @hash{@liste_cles}, on souhaite récupérer plusieurs élément d'un hash, le type retourné est donc un tableau, donc le sigil @ doit être utilisé tout à gauche.

    Si l'on dispose d'une référence au hash à la place d'un hash ($hash_ref par exemple), on écrit alors : @{$hash_ref}{@liste_cles}

    Si le hash est un élément d'un hash (sous hash donc), on faut alors écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my %struct = ( header => { cle1 => "toto", cle2 => "tutu" },
                          body => { cle1 => "TOTO", cle2 => "TUTU" } );
    say "struct.body.{cle1,cle2} = @{$struct{body}}{cle1,cle2}";
    Par contre, l'usage de -> n'est plus possible. Par exemple (et c'est bien dommage), on ne peut pas écrire : @{$hash_ref->{@liste_cles}}, ni @hash_ref->{@liste_cles}. Cette limitation devrait pouvoir être levée avec le déréfencement post-fix inspirée de perl 6 (on devrait pouvoir écrire quelque chose du genre $hash_ref->@{@liste_cles}).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je te remercie pour cette réponse très complète.
    -- Jasmine --

Discussions similaires

  1. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  2. Réponses: 6
    Dernier message: 05/07/2005, 11h05
  3. Réponses: 2
    Dernier message: 09/03/2005, 14h35
  4. [langage] hash de hash
    Par Kinethe dans le forum Langage
    Réponses: 17
    Dernier message: 27/08/2004, 13h22
  5. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55

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