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 :

utilisation des references en argument


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut utilisation des references en argument
    bonjour,

    après que Jasmine80 et Djibril m'aient donné des conseils hier (voir post : http://www.developpez.net/forums/d67...t/#post3938713)

    j'ai commencé à corriger mes autres scripts en suivant ces conseils, c'est dire éviter de passer en argument de fonctions des tables de hashage énorme, mais plutôt passer une référence vers cette table de hashage. Jusque là tout va bien, pas de problème notable, ça marche.

    Cela dit, j'ai une question sur ce code :
    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
    print "Extraction des donnees du fichier $opt_r...\n";
    my @ref_data = &Extract_data_tag();
     
    my $ref_tag = $ref_data[0];
    my $ref_FT = $ref_data[1];
     
    my %tags_infos = %$ref_tag;
    my %liste_FT = %$ref_FT;
     
    print "\tNombre de tags : ".keys(%tags_infos)."\n";
     
    print "\nRecherche des FT presents dans SQUAT...\n";
    my %liste_FT_SQUAT = &Presence_FT_SQUAT(\%liste_FT);
     
    print "\nRecherche des matrices correspondantes dans $opt_m...\n";
    my %FT_mtx_infos = &Extract_mtx_infos(\%liste_FT_SQUAT);
     
    print "\nFiltrage des données extraites du fichier $opt_r pour ne garder que les FT present dans SQUAT...\n";
    my %tags_infos_filtre = &Filtrage_FT_tags(\%tags_infos);
     
    print "\nRecuperation des ".$table."VirtualTag_id correspondant aux tags...\n";
    &Recup_tag_id(\%tags_infos_filtre);
     
    print "\nCreation des fichiers permettant de remplir les tables TRANSCRIPTION_FACTOR et MATRIX...\n";
    my %TF_id = &Creation_loaddataTF_mtx(\%FT_mtx_infos);
     
    print "\nCreation des fichiers permettant de remplir les tables TFBS et PROMOTER_USED...\n";
    &Creation_loaddataTFBS_prom_used(\%TF_id, \%tags_infos_filtre);
    La première fonction me renvoie des références vers deux tables de hashage qu'elle construit. Je déréférence ces deux tables dans deux nouvelles tables de hashage puis je les passe en références à deux autres fonction qui en ont besoin.
    Ma question est la suivante : est-il nécessaire/conseillé de d'abord les déférencer pour ensuite les passer à deux nouvelles fonction sous forme de nouvelles références, ou est-il possible/conseillé de les garder sous forme de référence tout le long et donc de passer aux deux autres fonction directement les références récupérées après l'appel de la première fonction ? (je sais pas si c'est bien clair ce que je raconte... )
    En fait, est ce qu'il vaut mieux utiliser le code ci-dessus, ou le code ci-dessous :
    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
    print "Extraction des donnees du fichier $opt_r...\n";
    my @ref_data = &Extract_data_tag();
     
    my $ref_tag = $ref_data[0];
    my $ref_FT = $ref_data[1];
     
    print "\tNombre de tags : ".keys(%tags_infos)."\n";
     
    print "\nRecherche des FT presents dans SQUAT...\n";
    my %liste_FT_SQUAT = &Presence_FT_SQUAT($ref_FT);
     
    print "\nRecherche des matrices correspondantes dans $opt_m...\n";
    my %FT_mtx_infos = &Extract_mtx_infos(\%liste_FT_SQUAT);
     
    print "\nFiltrage des données extraites du fichier $opt_r pour ne garder que les FT present dans SQUAT...\n";
    my %tags_infos_filtre = &Filtrage_FT_tags($ref_tag);
     
    print "\nRecuperation des ".$table."VirtualTag_id correspondant aux tags...\n";
    &Recup_tag_id(\%tags_infos_filtre);
     
    print "\nCreation des fichiers permettant de remplir les tables TRANSCRIPTION_FACTOR et MATRIX...\n";
    my %TF_id = &Creation_loaddataTF_mtx(\%FT_mtx_infos);
     
    print "\nCreation des fichiers permettant de remplir les tables TFBS et PROMOTER_USED...\n";
    &Creation_loaddataTFBS_prom_used(\%TF_id, \%tags_infos_filtre);

  2. #2
    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
    Code zaboug : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @ref_data = &Extract_data_tag();
     
    my $ref_tag = $ref_data[0];
    my $ref_FT = $ref_data[1];

    Tu peux directement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($ref_tag, $ref_FT) = &Extract_data_tag();
    Récupérer une référence de la fonction 1 et la passer à la fonction 2 est préférable ... à quoi bon déférencer après la fonction 1 pour ensuite recréer une référence à passer à la fonction 2? Tu peux utiliser des références tout le long de ton code.


    Ici
    Code zaboug : Sélectionner tout - Visualiser dans une fenêtre à part
    my %liste_FT_SQUAT = &Presence_FT_SQUAT($ref_FT);
    Tu récupères un tableau ... il vaut mieux que ta fonction renvoie une référence
    Code zaboug : Sélectionner tout - Visualiser dans une fenêtre à part
    my $Ref_liste_FT_SQUAT = &Presence_FT_SQUAT($ref_FT);
    -- Jasmine --

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    en fait, toutes mes fonctions utilise et/ou créer des tables de hashage. Si je comprend bien, à chaque fois l'idéal est de renvoyer une référence, et de l'utiliser ensuite tout le long du code.

    OK, j'en prend bonne note, merci

  4. #4
    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
    C'est ce que je ferais ... mais je ne suis pas une experte en références ... attends peut-être un second avis.
    -- Jasmine --

  5. #5
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    J'attend un second avis pour le tenir comme règle absolu, mais déjà j'ai testé sur ce script dont le temps d'exécution passe de 51sec à 38sec, c'est cool

  6. #6
    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 dirais que les références sont toujours bonnes à utiliser sauf par exemple quand tu veux modifier ton tableau dans le sous-programme sans toucher à celui du script principal, dans ce cas tu dois faire une copie de ton tableau et ne pas utiliser de référence (mais certains modules optimisent cela).
    -- Jasmine --

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

Discussions similaires

  1. boost::spirit utilisation des arguments
    Par SKone dans le forum Boost
    Réponses: 11
    Dernier message: 28/01/2011, 11h16
  2. [Fabrique] Besoin d'arguments pour utiliser des factories
    Par jm1974 dans le forum Design Patterns
    Réponses: 0
    Dernier message: 07/08/2009, 12h43
  3. [Débutant] Utiliser des listes en argument d'une fonction
    Par erkenbrand dans le forum Windows Forms
    Réponses: 10
    Dernier message: 29/05/2008, 12h56
  4. [ksh et/ou bash] Utilisation des arguments type -d
    Par novices dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 24/11/2007, 14h04
  5. Réponses: 8
    Dernier message: 29/03/2007, 11h16

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