[perl] le meilleur moyen pour ramener une valeur ?

le meilleur moyen pour ramener une valeur ? [perl] - Perl - Programmation

Marsh Posté le 30-06-2010 à 17:11:09    

Salut à tous,
je débute en perl et je cherche le meilleur moyen de faire un chose simple : une correspondance de valeur.
En gros de 0 à 5, j'aimerais que ça me retourne 1; de 6 à 10 me retourne 2 etc..
J'ai pensé à un tableau indicé mais je n'arrive pas à mes fins :

Code :
  1. my %test=([0..5]=>1, [6..10]=>2);
  2. print $test{1};


 
Est-ce la bonne méthode pour ce genre de manipulation de données ?


---------------
Mon topic Achat/ventes : http://forum.hardware.fr/hfr/Achat [...] 2496_1.htm
Reply

Marsh Posté le 30-06-2010 à 17:11:09   

Reply

Marsh Posté le 30-06-2010 à 19:20:16    

Si c'est un hash que tu veux obtenir, je ferais:
my %test;
map { $test{$_} = 1 } 0..5, map { $test{$_} = 2 } 6..10;
 
mais n'est ce pas plutôt d'une fonction dont tu aurais besoin?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-07-2010 à 18:57:27    

Merci pour le map  ça marche très bien :jap:  
 
Dans quel cas une fonction pourrait être utile ?
 
En fait, je souhaite créer un tableau double entrée du style :
 
Poids / Pays     France          USA
jusqu'à 5kg         1                9
Jusqu'à 10kg       2               10
 
 
 mais l'une de mes valeur clé étant un poids (donc pas forcément entier) je pense qu'il va falloir que je passe par des if .. elsif.


---------------
Mon topic Achat/ventes : http://forum.hardware.fr/hfr/Achat [...] 2496_1.htm
Reply

Marsh Posté le 01-07-2010 à 19:51:38    

Donc en fait, tu veux plutôt une fonction qui prend en entrée une valeur, et renvoie en retour un hash.
Je vais bouffer, et je te pond une réponse plus complète.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-07-2010 à 21:39:15    

Tu peux t'inspirer de ce petit script, que tu vas appeller avec: perl myscript.pl XX
ou myscript.pl est le nom du fichier du script et XX  un nombre à tester pour le poids.
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use Switch;
  6.  
  7. sub weight {
  8.    switch (shift) {
  9.        # is it a number? if not: error
  10.        case { $_[0] !~ /^-?(?:\d+(?:\.\d*)?|\.\d+)$/ }
  11.                   { return {France => "erreur: ce n'est pas un nombre", USA => 'error: not a number'}}
  12.        # it is a number
  13.        case { $_[0] <= 0 }  { return {France => 'erreur: trop petit', USA => 'error: too small'}}
  14.        case { $_[0] <= 10 } { return {France => '1', USA => '9'}}
  15.        case { $_[0] <= 20 } { return {France => '2', USA => '10'}}
  16.        else                 { return {France => 'erreur: trop grand', USA => 'error: too large'}}
  17.    }
  18. }
  19.  
  20. my $code = weight($ARGV[0]);
  21. print $code->{France}, " ", $code->{USA}, "\n";


Il ne te reste plus ensuite qu'à adapter à tes besoins.
A+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-07-2010 à 18:55:04    

Génial ! Merci.  :bounce:  
je ne connaissais pas le module Switch mais c'est très pratique.
 
Juste une question : le switch(shift) c'est parce que l'argument passé en paramètre de la fonction est un tableau ?


---------------
Mon topic Achat/ventes : http://forum.hardware.fr/hfr/Achat [...] 2496_1.htm
Reply

Marsh Posté le 02-07-2010 à 19:16:03    

C'est juste équivalent à

Code :
  1. sub weight {
  2.    my $toto = shift;
  3.    switch ($toto) {

mais ça évite de définir une variable explicite inutile ($toto ici);
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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