ajouter une même valeur à tous les éléments d'un tab...[autre quest°]

ajouter une même valeur à tous les éléments d'un tab...[autre quest°] - Perl - Programmation

Marsh Posté le 21-04-2005 à 14:33:13    

Voilà, j'ai un petit problème...
j'ai un tableau où chaque élément est un entier.ex : [8,12,13,15,16]
j'aimerai savoir s'il y a un moyen d'ajouter de manière légère une constante à chaque élément du tableau. ex : ajouter 1 à chaque élément. le tableau deviendrai : [9,13,14,16,17]
le pb, c'est qu'il faudrait que ça soit le plus léger possible car je travaille sur un tas de tableau. la valeur qu'on ajoute sera tjs +1.
Pouvez vous m'aider svp?  :jap:


Message édité par babarpapa le 22-04-2005 à 11:50:13

---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 21-04-2005 à 14:33:13   

Reply

Marsh Posté le 21-04-2005 à 16:21:25    

le mieux est sans doute de garder l'increment dans une autre variable, et donc de l'augmenter à chaque fois sans toucher au tableau, puis, au moment d'afficher le tableau ou de le sauvegarder (etc.), tu ajoute une bonne fois la valeur de l'increment à tous tes elements et tu le remet à 0. Tu peux egalement considerer que la valeur d'un element de ton tableau est toujours etre considérée comme valeur+increment

Reply

Marsh Posté le 22-04-2005 à 11:49:38    

merci, ta réponse me va très bien ;)
j'ai un autre petit souci...
j'ai un hash avec les clé qui sont des noms de genes : ex : [CX98,BX32,CZ58 etc...]
et à chaque clé correspont une liste de nombre : [2,4,8,12 etc...].
je vais faire un foreach my $subject (keys %hash){ ...}
sauf qu'il faudrait que le premier $subject soit le nom de gene qui à comme tableau qui lui est affecté le plus petit premier élément de la liste...
c'est pas super clair.. :)
ex : cX98 => [2,4,8,12]
     BX32 => [4,8,25]
 
et donc j'aimerai que ce soit CX98 qui soit le premier $subject que j'analyse, car il a comme premier élément 2.
j'espère que j'ai été a peu près clair...
merci pour votre aide  

Reply

Marsh Posté le 22-04-2005 à 12:03:06    

il faut faire une fonction de tri
ca donnera un truc genre (non testé):

Code :
  1. for my $subject (sort {$hash{$a}->[0] <=> $hash{$b}->[0]} keys %hash) {...}


Message édité par pospos le 22-04-2005 à 12:03:44
Reply

Marsh Posté le 22-04-2005 à 12:20:50    

il faut que j'ajoute à la première valeur du tableau la valeur d'incrémentation (dont on parle plus haut), et que je compare avec cette valeur ajouté au premier élément. la valeur 'incrémentation se trouve ici :

Code :
  1. $hash{$subject}{incremt}


alors que le tableau se trouve là :  

Code :
  1. @hash{$subject}{pos}


 
donc est ce que je peux écrire ça :

Code :
  1. for my $subject (sort {($rh_sub_gap{$a}->[0] + $rh_sub_gap{$a}{incremt}) <=> ($rh_sub_gap{$a}->[0] + $rh_sub_gap{$a}{incremt})} keys %hash) {...}


 
ça veut peut etre rien dire... :)


Message édité par babarpapa le 22-04-2005 à 13:24:01

---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 22-04-2005 à 13:41:30    

oui ca doit marcher (avec $b dans la partie droite evidemment)


Message édité par pospos le 22-04-2005 à 13:42:09
Reply

Marsh Posté le 22-04-2005 à 13:50:31    

ah oui, pardon ;)
merci pour ton aide


---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 22-04-2005 à 13:55:56    

mais attend, je pige pas un truc:
c'est pas un tableau aen fait ton truc, c'est une hash??
tu fais une hash avec des entiers comme clé? C'est pas tres efficace ca.
 
donc en fait t'as ca (par exemple) :
cX98 => {
 0 => 2,
 1 => 4,
 2 => 8,
 3 => 12,
 increment => 4
}
 
c'est bien ca?
donc dans ce cas c'est

Code :
  1. for my $subject (sort {($rh_sub_gap{$a}->{0} + $rh_sub_gap{$a}->{incremt}) <=> ($rh_sub_gap{$b}->{0} + $rh_sub_gap{$b}->{incremt})} keys %rh_sub_gap) {...}


 
ou ->{1} si le premier element de ton tableau est sur le rang 1
 
mais bon, c'est moins efficace en terme de place et de vitesse qu'un vrai tableau
 
ce que tu pouurais faire c'est conserver un tableau et mettre l'increment sur le premier element, en considerant que le tableau commence au suivant (donc ->[1])
 
t'aurais donc:
$hash{$subject}->[0] = increment
et
$hash{$subject}->[1] = premier element
 
et donc:

Code :
  1. for my $subject (sort {($rh_sub_gap{$a}->[1] + $rh_sub_gap{$a}->[0]}) <=> ($rh_sub_gap{$b}->[1] + $rh_sub_gap{$b}->[0])} keys %rh_sub_gap) {...}


Message édité par pospos le 22-04-2005 à 13:56:52
Reply

Marsh Posté le 22-04-2005 à 14:00:55    

je t'embete une toute derniere fois...(pour aujourd'hui ^^)
c'est un tableau que je passe par référence à un sous programme.
et je suis pas allaise avec ça...
ça s'écrit comme ça quand le tableau de hash est une référence?  

Code :
  1. for my $subject (sort {($$rh_sub_gap{$a}->[0] + $$rh_sub_gap{$a}{incremt}) <=> ($$rh_sub_gap{$b}->[0] + $$rh_sub_gap{$b}{incremt})} keys %$rh_sub_gap) {...}


---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 22-04-2005 à 14:05:27    

oui, mais ecrit plutot plutot $rh_sub_gap->{$a}->[0]


Message édité par pospos le 22-04-2005 à 14:05:56
Reply

Marsh Posté le 22-04-2005 à 14:05:27   

Reply

Marsh Posté le 22-04-2005 à 14:06:38    

ok ^^
et donc également  $rh_sub_gap->{$a}{incremt} j'imagine?


Message édité par babarpapa le 22-04-2005 à 14:07:47

---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 22-04-2005 à 16:52:44    

quand tu mets for... c'est for ou foreach?  :)


---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 22-04-2005 à 16:57:04    

la structure du hash est cela au fait :
cX98 => {  
 gap_pos => [2,5,6,8,9,25]  
 increment => 4  
}  
cX25 => {
 gap_pos => [4,5,8,12,15,19]  
 increment => 2  
}  
 
ou CX98 et CX25 sont les clé...
je sais pas si tu vois mieux?...
 
 
 
donc au final, ça serait un truc comme ça, non?

Code :
  1. foreach my $subject (sort {($rh_sub_gap->{$a}{gap_pos}->[0] + $rh_sub_gap->{$a}{incremt}) <=> ($rh_sub_gap->{$b}{gap_pos}->[0] + $rh_sub_gap->{$b}{incremt})} keys %$rh_sub_gap) {


 
mais ça marche pas  :)


Message édité par babarpapa le 22-04-2005 à 17:03:09

---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 22-04-2005 à 17:47:47    

chez moi ca marche:

Code :
  1. my %hash = (
  2. cX98 => { 
  3.  gap_pos => [2,5,6,8,9,25],
  4.  increment => 10 
  5. },
  6. cX25 => {
  7.  gap_pos => [10,5,8,12,15,19],
  8.  increment => 1 
  9. },
  10. );
  11.  
  12. my $rh_sub_gap = \%hash;
  13. for my $subject (sort {($rh_sub_gap->{$a}->{gap_pos}->[0] + $rh_sub_gap->{$a}->{increment}) <=> ($rh_sub_gap->{$b}->{gap_pos}->[0] + $rh_sub_gap->{$b}->{increment})} keys %$rh_sub_gap) {
  14. print "$subject\n";
  15. }


 
t'as du te gourer en ecrivant increment (incremt)
 
sinon j'ai rajouté les '->' pasque c'est plus correcte (mais ca marchait)

Reply

Marsh Posté le 23-04-2005 à 23:23:19    

j'ai pas encore tester, mais c koi la difference entre le for de ton code et foreach stp?
 
d'autre part, je suis aller un peu vite, car quand je te dit que c'est ça mon tableau de hashage :
my %hash = (  
    cX98 => {    
     gap_pos => [2,5,6,8,9,25],  
     increment => 10    
    },  
    cX25 => {  
     gap_pos => [10,5,8,12,15,19],  
     increment => 1    
    },  
);
 
en fait, gap_pos n'est pas directement associé à une liste, mais plutot à une référence sur une liste que je lui donne...mais je pense pas que ça change grand chose ^^


Message édité par babarpapa le 25-04-2005 à 08:29:06

---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 25-04-2005 à 09:46:40    

[] c'est une reference vers une liste. c'est equivalent à \@a par exemple.
 
for et foreach c'est la meme chose, mais bon plus personne n'ecrit foreach ne nos jours (on dirait un vieux script CGI des années 90...)

Reply

Marsh Posté le 25-04-2005 à 10:08:21    

pospos a écrit :

[] c'est une reference vers une liste. c'est equivalent à \@a par exemple.
 
for et foreach c'est la meme chose, mais bon plus personne n'ecrit foreach ne nos jours (on dirait un vieux script CGI des années 90...)


 
ok pour le foreach ^^
 
et pour la reference, oui, c'est eaxctement ça, c'est un \@a

Reply

Marsh Posté le 25-04-2005 à 10:43:42    

donc ca corespond bien à la structure que j'ai ecrit
 
pour t'en convaincre essai de le dumper à l'ecran:

Code :
  1. use Data::Dumper;
  2. print Dumper $rh_sub_gap;

Reply

Marsh Posté le 25-04-2005 à 17:04:17    

ça fonctionne nickel :)
y'a encore un tout piti pb, c'est qu'il peut arriver qu'il y ait des tableau vide... donc il me fait une erreur quand il veut faire la comparaison pour le for... y'a t ' il un moyen pour kil ne fasse la comparaison qu'avec les tableau non vides?

Reply

Marsh Posté le 25-04-2005 à 18:04:52    

il te sort un warning ou il plante?
si c'est juste un warning (tableau existant mais vide) c'est pas bien grave. Met juste un "no warnings" au dessus et ca roule.
 
par contre si il plante c'est que le tableau n'est pas simplement vide, mais inexistant. Dans ce cas c'est à toi de faire en sorte que gap_pos se voit au moins assigner un tableau vide []
 
Sinon il y a evidemment moyen de verifier ca pendant le tri, mais ca ralentira les choses inutilement

Reply

Marsh Posté le 26-04-2005 à 14:30:56    

je connaissais pas "no warnings" et evidement, ça marche ;)
merci pour tous ces tuyaux! :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed