salut, j'ai encore un problème avec mon hash.....
j'ai un hash qui possède une clé de type :
cette clé est en fait composé de 2 éléments:gi|19612490|gb|AAH49588.1|__122'
'gi|19612490|gb|AAH49588.1|__12'
'hi|19612490|gb|AAH49588.1|__114'
'hi|19612490|gb|AAH49588.1|__113'
'gi|19612490|gb|AAH49588.1|__112'
'gi|19612490|gb|AAH49588.1|__111'
'gi|19612490|gb|AAH49588.1|__110'
'gi|19612490|gb|AAH49588.1|__11'
'gi|19612490|gb|AAH49588.1|__108'
'hi|19612490|gb|AAH49588.1|__11'
'hi|19612490|gb|AAH49588.1|__106'
'gi|19612490|gb|AAH49588.1|__105'
gi|19612490|gb|AAH49588.1| et __11
et j'aimerai pouvoir trier ce hash , d'abord par ordre alphabétique pour le 1er élément puis par ordre numérique pour le 2ème élément
Pour cela, je dois utiliser la fonction ( je sais que ca marche avec!)
en fait cette fonction permet de à partir des deux clés:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 sub byseq { my ($a1,$a2) = split /___/,$a; ## split permet de separer avant ($a1) et apres ($a2) __ de $a, $a etant la cle du hash my ($b1,$b2) = split /___/,$b; ## split permet de separer avant ($b1) et apres ($b2) __ de $b, $b etant la cle du hash if ($a1 ne $b1) { return ($a1 cmp $b1); } return ($a2-$b2); }
gi|19612490|gb|AAH49588.1|__11
hi|19612490|gb|AAH49588.1|__109
de séparer les deux éléments de la clé en $a1 pour gi|19612490|gb|AAH49588.1|, $a2 pour 11, $b1 pour hi|19612490|gb|AAH49588.1|, et $b2 pour 109
puis on compare $a1 et $b1, puis $a2 et $b2
mais le problème est que je n'arrive pas à faire le tri numérique.
en fait : j'obtiens : pour la clé qui commence par hi 114, 113, 11, 106, et pour celle qui commence par gi 122, 111, 110, 11, 108, puis 105
or je souhaite obtenir pour la clé qui commence par hi 114, 113, 106, 11 et pour celle qui commence par gi 122, 111, 110, 108, 105 et 11.
voici mon 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
29
30 #!/usr/bin/perl use strict; my %hash = ('gi|19612490|gb|AAH49588.1|__122' => 20, 'gi|19612490|gb|AAH49588.1|__12' => 21, 'hi|19612490|gb|AAH49588.1|__114' => 12, 'hi|19612490|gb|AAH49588.1|__113' => 212, 'gi|19612490|gb|AAH49588.1|__112' => 2, 'gi|19612490|gb|AAH49588.1|__111' => 5, 'gi|19612490|gb|AAH49588.1|__110' => 4, 'gi|19612490|gb|AAH49588.1|__11'=> 22, 'gi|19612490|gb|AAH49588.1|__108' => 32, 'hi|19612490|gb|AAH49588.1|__11' => 42, 'hi|19612490|gb|AAH49588.1|__106' => 4, 'gi|19612490|gb|AAH49588.1|__105' => 6, ); sub byseq { my ($a1,$a2) = split /___/,$a; ## split permet de separer avant ($a1) et apres ($a2) __ de $a, $a etant la cle du hash my ($b1,$b2) = split /___/,$b; ## split permet de separer avant ($b1) et apres ($b2) __ de $b, $b etant la cle du hash if ($a1 ne $b1) { return ($a1 cmp $b1); } return ($a2 <=> $b2); } for my $key (reverse (sort { byseq ($a, $b) } keys (%hash))) { print "$key\t\t$hash{$key}\n"; }
Merci d'avance
Partager