comparaison de chaine mais de nombre :-/

comparaison de chaine mais de nombre :-/ - Perl - Programmation

Marsh Posté le 22-04-2004 à 10:52:28    

Je voudrais comparer deux chaines de caracteres en tant que nombre mais lorque j'utilise le "<=>" il me dit que ce n'est pas numérique (normal vu que c'est une chaine). Mais lorsque j'utilise la comparaison avec "cmp", il ne compare pas correctement.
 
Explicitons :
 
Ca c'est mon code:

Code :
  1. my $i;
  2. my @tab=("1.2.1","1.2.3","1.2.10","1.2.2","1.2.21" );
  3. my @tri = sort fct @tab;
  4. sub fct {$a cmp $b;}
  5. for ($i=0;$i<5;$i++) {
  6.     print $tri[$i]."\n";
  7. }


 
A l'affichage on, obtient:

Code :
  1. 1.2.1
  2. 1.2.10
  3. 1.2.2
  4. 1.2.21
  5. 1.2.3


 
Alors que j'aimerais obtenir:

Code :
  1. 1.2.1
  2. 1.2.2
  3. 1.2.3
  4. 1.2.10
  5. 1.2.21


 
Avez vous une astuce ?
 
Merci d'avance !  :jap:

Reply

Marsh Posté le 22-04-2004 à 10:52:28   

Reply

Marsh Posté le 24-04-2004 à 22:08:29    

Perl sait convertir automatiquement une chaine en un nombre si ce string "ressemble" à un nombre, et donc il saura utiliser un comparateur <=> sur des chaines representant des nombres, mais ca n'est pas le cas ici: "1.2.1" ca ne ressemble pas à un nombre...
 
Par contre tu peux customiser un peu ta fonction de comparaison pour que ca marche:
 

Code :
  1. my @tab=("1.2.1","1.2.3","1.2.10","1.2.2","1.2.21" );
  2. my @tri = sort fct @tab;
  3. sub fct {sprintf("%02d%02d%02d", split(/\./, $a)) <=> sprintf("%02d%02d%02d", split(/\./, $b))}
  4. print join("\n", @tri);


 
ici on supprime les "." en remplacant chaque partie par un nombre à deux chiffres
par exemple 1.2.10 => 010210
 
et ensuite on peut faire la comparaison (avec cmp ou <=> d'ailleurs)

Reply

Sujets relatifs:

Leave a Replay

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