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 :

Encadrer une valeur.


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 10
    Par défaut Encadrer une valeur.
    Bonjour,

    j'ai débuté Perl depuis quelques mois et j'ai souvent erré sur votre forum pour résoudre mes problèmes. Mais cette fois, après pas mal de tests j'en appelle à votre savoir.

    Voici mon problème :

    j'ai deux tableaux , @tableau1 qui varie selon chaque clés d'une table d'un hash et @tableau2 qui ne varie pas.

    Ce que j'aimerai c'est encadrer chaque valeur de mes X @tableau1 par celles du @tableau2 et récupérer ces valeurs d'encadrement.

    J'ai tenté les while, until mais ca finit toujours en boucle infinie

    J'ai trouvé ce bout de solution sur ce forum et j'ai bidouillé à ma sauce mais çà ne fonctionne pas super bien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach my $key ( keys %hash)
         {
     
         my @tableau1 = @{$hash{$key}} ;
     
         foreach my $value1 (@tableau1)
                {
                my $value2 = $tableau2[0] ;
                map {$value_sup = $value2 if ( $values2 => $value1) }@tableau2 ;
                map {$value_inf  = $value2 if ( $values2 <= $value1) }@tableau2 ;
                }
          }
    Merci pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas ce que tu veux faire, mais ta fonction map n'itère sans doute pas sur les valeurs contenues dans le tableau, puisqu'elle utilise 4 variables fixées.

    Pour que le code de map utilise les valeurs du tableau2, il faut utiliser la variable $_.

    Probablement quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map {$value_sup = $_ if ( $_ >= $value1) }@tableau2 ;
    Mais c'est juste une idée, car je ne comprends pas ce que tu veux faire exactement.

    En fait, c'est une erreur d'utiliser map dans ce contexte. La fonction map est faite pour lire un tableau, faire un travail sur ses valeurs et retourner un autre tableau.

    Dans ton cas, c'est plutôt foreach qu'il faudrait utiliser.

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    foreach @tableau2 { $value_sup = $_ if ( $_ >= $value1) };

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 10
    Par défaut
    En fait, dans mon @tableau2 j'ai les valeurs suivantes [ 0.1, 0.2, 0.5, 1, 2, 5, 10, 15].

    Et dans mon @tableau1 j'ai par exemple les valeurs [ 0.145, 0.149, 0.648, 1.235, etc...]

    Je veux pour chaque valeurs des mes X @tableau1 :

    0.1 < 0.145 < 0.2
    0.1 < 0.149 < 0.2
    0.5 < 0.648 < 1
    1 < 1.235 < 2

    ETC...

    J'ai essayé le solution que tu m'as fourni :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach @tableau2 { $value_sup = $_ if ( $_ >= $value1) };
    elle minore bien chacune de mes valeurs. J'ai essayé de la retranscrire pour déterminer la valeur supérieur la plus proche mais cela ne fonctionne pas, elle majore avec la plus grande valeur de mon @tableau2.

  5. #5
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    que penses-tu de ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    foreach (@tableau2) { $value_inf = $_ unless ( $_ >= $value1) };
    foreach (reverse(@tableau2)) { $value_sup = $_ unless ( $_ <= $value1) };

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Une autre méthode

    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
    #!/usr/bin/perl
     
    use feature qw(:5.10);
    use strict;
    use warnings;
     
    my @tableau1 = (0.145, 0.149, 0.648, 1.235);
    my @tableau2 = (0.1, 0.2, 0.5, 1, 2, 5, 10, 15);
     
    foreach my $val (@tableau1) {
      my @inter = @tableau2;
      my ($val_inf, $val_sup) = (shift @inter);
      if ($val >= $val_inf) {
        while ($val_sup = shift @inter) {
          last if $val <= $val_sup;
          $val_inf = $val_sup;
        }
      }
      if ($val >= $val_inf && $val <= $val_sup) {
        say "$val is between $val_inf and $val_sup";
      }
      else {
        say "$val is outside any interval";
      }
    }

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 10
    Par défaut
    Bon en faisant un mixe de vos solutions ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    foreach (reverse(@tableau2)) { $value_sup = $_ unless ( $_ <= $value1) };
    foreach (@tableau2)             { $value_inf   = $_ if ($energy >= $_ ) } ;
    Par contre il faut que ma liste soit bien trié...et la j'ai un soucis :

    j'ai beau faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @tableau2 = reverse ( sort { $a < $b }@tableau2 ) ;
    je print :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    15.0 10.0 3.0 2.0 5.0 1.5 1.3 1.0 0.7 0.5 0.1
    Il ne veut pas me ranger le 5.0 à sa bonne place ! Ce qui fait génère une erreur dans mon encadrement puisque si 5 majore ma valeur, il ne va pas aller chercher si 2 ou 3 la majore également !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encadrer la valeur d'une condition
    Par enrico83600 dans le forum Langage
    Réponses: 3
    Dernier message: 02/10/2009, 18h23
  2. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55
  3. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37
  4. Prendre une valeur dans la grappe XML
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 21/05/2003, 10h26
  5. Afficher une valeur du context
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 13
    Dernier message: 28/04/2003, 13h49

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