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 :

reprendre une hash crée dans un sous programme


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 242
    Par défaut reprendre une hash crée dans un sous programme
    Bonjour,
    Mon probleme est le suivant : j'ai crée une hash dans une sous fonction et je voudrais l'utiliser dans une autre sous fonction de mon programme principal .

    L'utilisateur va
    1- passer à mon programme des séquences adn ACGT (role de sub encodage())
    et
    2 -va choisir le code qu'il désire pour convertir ces sequences en chiffres (puis A peut etre remplacer par plusieurs valeurs différentes 0.5 ou 0.359962 ou 1 ...)
    ca c le role de sub Attribution()

    donc dans l'ordre il va d'abord choisir son codage désiré (n °2) puis convertir les sequences avec le codage adéquat (n°1)

    Voici le schéma de mon code pour faire simple :

    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
     
    #code principal [....
     
    #      si l'utilisateur est ok on va commencer le traitement de donnée :
    #                               &Attribution()
    #                             puis &Encodage() affichage du resultats 
     
    #....] fin du code principal
     
    sub Attribution { 
                            va mettre en place ma hash et va la retourner 
                          ..... return (%Tablecode)
                             }
     
    sub Encodage { 
                            va lire les sequences puis va les passer à un autre sous programme sub Transformation qui va avoir en argument le hash 
                               lecture
                              & Transformation(%hash)}
     
    sub Transformation {
    my %h = %_;
    	my @cle = ();
    	my $i;
    	@cle=           ("A","R","N","D","C","Q","E","G","H","I","L","K","M","F","P","S","T","W","Y","V");
    	foreach $i (@cle) {
    	print ("hash($i) = $h{$i}\n");
    	}
    	}
    pour le moment dans sub Transformation je n'ai fait que ca juste pour voir si j'arrive bien à recupérer le hash que je passe en argument mais je n'y arrive pas

    msg d'erreur :Use of uninitialized value in concatenation (.) or string at testcodage.pl

    OR j'ai testé lors de la création du hash que celui était bien créé donc en l'affichant.

    Donc ma question finale est : comment récuperer une hash qu'on passe en argument à une fonction
    et
    ma suspicion est : dans ma sous fonction Attribution : est ce que je retourne bien mon hash pour mes autres traitements juste en mettant à la fin "return (%Tablecode)" (comme ca se fait en python).


    Merci !!
    J'ai cherché ds la doc mais c'est surtout au niveau du passage en argument d'une hash à un sous programme que j'ai pas trouvé mon bonheur.

  2. #2
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut
    En fait, il faut retourner une reference sur une hashmap et non celle ci...(Une reference, c'est l'adresse de ton hashmap equivalent aux pointeurs en C++)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return (\%hashmap);
    Pour recuperer les valeurs de ton hashmap plusieurs solutions s'offrent a toi...
    Ma preferée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my ($refhashmap) = @_;
    # ici j'affecte une valeur a ma clé
    $refhashmap->{$key} = $newvalue;
    Je te renvoie à la section suivante de la FAQ si utile...



    Bonne chance...

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    sub Transformation {
    my %h = %_; => problème ici
    c'est pas la bonne ecriture.
    c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %h = @_; #(un hash est aussi une liste)
    Sinon comme te l'a dit crochepatte, c'est une bonne idée de recupérer plutot une reference au tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sub Transformation {
      my ($ref_hash) = @_; 
      ...
      ...
    return $ref_hash_resultat;
    }
    voilà

  4. #4
    Membre confirmé Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 242
    Par défaut
    évolution évolution .....
    j'en suis à là et il me semble clair que j'importe pas bien ma hash.

    je resume:
    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
     
    sub Attribution {
                           $ligne2 = <CODAGE>; 	 
     
    			@code=split/\s+/,$ligne2;			
     
    			#deuxieme ligne de codage
    			$ligne3 = <CODAGE>; 	 
     
    			@code2=split/\s+/,$ligne3;
     
    			my %Tablecode =("A"=>$code[1], "R"=>$code[2], "N"=>$code[3], "D"=>$code[4], "C"=>$code[5], "Q"=>$code[6], "E"=>$code[7], "G"=>$code[8], "H"=>$code[9], "I"=>$code[10], "L" => $code2[1], "K" => $code2[2], "M" => $code2[3], "F" => $code2[4], "P" => $code2[5], "S" => $code2[6], "T" => $code2[7], "W" => $code2[8], "Y" => $code2[9], "V" => $code2[10]);
     
    			print "Vos Valeurs sont les suivantes:\n";
    			#while((my $clef,my $valeur)=each %Tablecode) 
    			#	{
    			#	print "$clef => $valeur\n";} (LA C'EST EN COMMENTAIRE MAIS QUAND JE LUI DIS DE LE FAIRE YA PAS DE SOUCIS CA MARCHE)
     
    			return (\%Tablecode);
     
     
    sub Encodage {
     
    my %ref_Tablecode = @_;
    for my $cle (keys %ref_Tablecode) {
    	print "$cle => $ref_Tablecode{$cle}\n";}
                         }
    là ca bloque ca me dit :
    Reference found where even-sized list expected at test3.pl line 92, <CODAGE> line 23.
    Use of uninitialized value in concatenation (.) or string at test3.pl line 94, <CODAGE> line 23.
    HASH(0x817da20) =>

    j'ai trouvé dans la doc (cf: perlreftut )aussi une autre méthode avec les références la voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    sub Encodage {
     
    my ($ref_Tablecode) = @_;
    for my $cle (keys %${ref_Tablecode}) {
    	print "$cle => $${ref_Tablecode}{$cle}\n";}
    	}
    et là pas de messages d'erreur , on me rend la main

  5. #5
    Membre confirmé Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 242
    Par défaut
    au niveau du message d'erreur j'ai trouvé ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Reference found where even-sized list expected
        (W) Vous avez donné une référence unique là où Perl s'attend à avoir une liste avec un même nombre d'éléments (pour affectation à un tableau associatif). Cela veut dire que vous utilisez le constructeur anon hash alors que vous vous attendiez à utiliser parens. Dans tous les cas, un tableau associatif (hash) nécessite une paire clef/valeur.
     
         %hash = { one => 1, two => 2, };   # MAUVAIS
         %hash = [ qw/ an anon array / ];   # MAUVAIS
         %hash = ( one => 1, two => 2, );   # correct
         %hash = qw( one 1 two 2 );         # correct
    sur le site perl.enstimac.fr/DocFr/perldiag.html :
    mais l'indice qu'il m'apporte ne semble pas m'aider puisque ma hash est faite de la manière qu'il conseille

  6. #6
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut
    Tu es sûr de ta fonction Encodage???

    Essaie cela...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sub Encodage {
     
    my ($ref_Tablecode) = @_;
    for my $cle (keys %{$ref_Tablecode}) {
    	print "$cle => $ref_Tablecode->{$cle}\n";}
    	}

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 14/01/2011, 20h41
  2. Réponses: 3
    Dernier message: 27/11/2006, 14h16
  3. Réponses: 6
    Dernier message: 02/10/2006, 12h13
  4. Réponses: 11
    Dernier message: 24/01/2006, 10h20
  5. Envoi d'informations dans un sous programme
    Par Tanguy Sarela dans le forum Linux
    Réponses: 3
    Dernier message: 22/12/2005, 16h57

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