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

  1. #1
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    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 habitué Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Points : 145
    Points
    145
    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 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    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 régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    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 régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    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 habitué Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Points : 145
    Points
    145
    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";}
    	}

  7. #7
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Et lis la FAQ, j'ai rédigé une section sur les références

  8. #8
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut
    Ben j'ai essayé et rien ne se passe
    il me rend la main
    pourtant la fonction encodage est simple !!
    je vais mettre tout mon code ; désolée ca va être lourd

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    #!usr/bin/perl 
     
    use strict;
    use warnings;
     
     
     
    my $description ="Description.txt";  
     
    open (DESCRIPT, $description) or
      die "Desole, impossible d'acceder à ".$description.".\n";
     
    # lignes du fichier Description
    my @lignes = <DESCRIPT>;
     
    my $i;
    my $indexcourant = 0;
    my $selection = 1; 
    my $nombrecodeecran = 70;
    my %Tablecode = ();
    while ($selection)
    {	
     
    	# on affiche les nombrecodeecran premier code a partir de la position indexcourant
     
    	for ( $i=$indexcourant; $i<$indexcourant+$nombrecodeecran; $i++)
    		{print "$lignes[$i]";}
     
    	print "\tindice du codage choisi: ";
    	chomp (my $indice = <STDIN>);
     
     
     	if ($indice=~ m/\A\d+\Z/)
    	{
    		# on sort de la boucle
    		$selection = 0;
    		print "Le code selectionne est $indice\n";
    		Attribution($indice);
    		Encodage(\%Tablecode);
     
    	}
    	else {
    		if ($indice=~ m/\A\s*\Z/ ){	
    			 $indexcourant += $nombrecodeecran;
    			}	
     
    		else { print "Vous avez rentré un mauvais numero" }
    		} 
    }
     
    sub Attribution {
    	my $codage ="Codage.txt";
    	open (CODAGE,$codage)or
      	die "Desole, impossible d'acceder à ".$codage.".\n";
     
    	my $ligne;
    	my $ligne2;
    	my $ligne3;
    	my %Tablecode = ();
    	my @code = ();my $code;
    	my @code2= ();my $code2;
     
    	#lignes du fichier Codage
    	while ($ligne = <CODAGE>) {
    		if ($ligne =~ /^$_[0]\t/)  #on recherche les lignes concernant l'indice rentré par utilisateur
    			{
    			#premiere ligne de codage
    			$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";}
     
    			return (\%Tablecode);
    			}
    		else {next}
    		}
    	}
     
     
    sub Encodage {
     
    my ($ref_Tablecode) = @_;
    for my $cle (keys %{$ref_Tablecode}) {
    	print "$cle => $ref_Tablecode->{$cle}\n";}
     
     
    #ICI C'EST LA SUITE DE MON SCRIPT QUI VA LIRE LE FICHIER DE SEQUENCES ET C'EST DANS CETTE PARTIE QUE JE VAIS RAJOUTER LE TITE BOUT CI DESSUS 
    (JE VAIS PAR ETAPE)
    my $OutFile= ">outpg1.fasta";
    my $seq = "";
    my $counter = 1;
     
    my $nom="Description.txt";
     
    #interrogation de l'utilisateur:
    #print " nom du fichier a traiter dans le dossier sequence: ";
    #chomp (my $fileName = <STDIN>); 
     
    my $fileName="jeu2.fasta";
    open (INFILE, $fileName) or
      die "Desole, impossible d'acceder a ".$fileName.".\n";
     
     
    open(OUTFILE,$OutFile);
     
    # traite le cas du premier identifiant du document
    my $ligne=<INFILE>;
    if ($ligne =~ /^(>gi\|(\d+)\|[\w.]+\|)/){
    		my $id = $1;	#$1 == (>gi\|(\d+)\|[\w.]+\|)
    		print OUTFILE $id.";"};
     
    # traite le cas de la sequence du premier identifiant puis des autres (id,sequence) du 
    # fichier
    my @temp = ();
    my $temp2;my $long;  
     
    while ($ligne = <INFILE>) {
     
    	#elimination des lignes vides dans le fichier
            if ($ligne =~ /^[\s\t]+$/) { next }   
     
    	else {		
                  	if ($ligne =~ /^(>gi\|(\d+)\|[\w.]+\|)/){
     
    			if ($counter == 0) {
     
    				$seq=~ s/;$//;	  #regex qui dit "si le dernier caractere est un ; remplace le par rien "	
    				print OUTFILE"$seq;$long\n";
    				$seq="";
     
    				$ligne =~ /^(>gi\|(\d+)\|[\w.]+\|)/; #je réécris cette ligne pour pouvoir affecter la parenthèse de la regex à $i
    				my $id = $1; #$1 == (>gi\|(\d+)\|[\w.]+\|)
    				print OUTFILE $id.";";
     
     
    				$counter = 1;
    				$long = 0;	
     
    			}	
    		}
    		else { 
    			@temp = split(/\s+/, $ligne);			
       			$temp2 = join(";",@temp);
    			$seq .= $temp2;
    			$long += length($temp2);
     
    			$counter = 0;
    		}
    	}
    }
     
    # traite le cas de la derniere sequence du document
    $seq=~ s/;$//;	#regex qui dit "si le dernier caractere est un ; remplace le par rien "
    print OUTFILE "$seq;$long\n";
    }

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Points : 145
    Points
    145
    Par défaut
    Excuse j'ai pas fait attention, mais il faut deja faire une boucle foreach au lieu de for....

    Je vais essayer de regarder le reste...

  10. #10
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut
    j'ai lu Djibril : apres aurais je mal lu?

  11. #11
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    c'est
    et non

    De plus indente bien ton code.

  12. #12
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut
    Alors voilà on m'a donné une astuce en fait le soucis ne venait pas du code de Encodage (heureusement puis que j'ai suivi tout de la doc )
    mais de l'appel de Encodage :
    ce qu'il fait faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Encodage(Attribution($indice));
    et non plas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Attribution($indice)
    Encodage(\%Tablecode);
    Merci de votre aide !!

+ 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