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 :

Faire un map intelligent [tranche de hash en hash pas en liste]


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut Faire un map intelligent [tranche de hash en hash pas en liste]
    Dans un de mes scripts je doit récupérer une tranche de hash mais je ne veut pas d'une liste plate mais d'un hashage.

    J'ai donc essayé de faire une map intelligent comme cela :

    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
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use Data::Dumper;
     
    my %m = ( l => 7, k => 9, y => 10, p => 46);
     
    my $i = 3;
     
    my %t = map {   if ($i > 0 and exists $m{$_} )
                    {
                        $i--;
                       $_ => $m{$_};
                    }
                } keys %m;
    print Dumper(\%t);

    Dans mon code de teste je veux récupérer trois clefs mais cela ne fonctionne pas très bien car une quatrième clef vide est créer par perl elle point sur la valeur undef .

    merci
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  2. #2
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Pour faire ce que tu veux, il faut déjà savoir que la méthode map s'applique à TOUS les éléments du tableau passé en paramètre. Il faut également savoir qu'une hashmap est un tableau particulier. Il faut enfin savoir que Perl a tendance à fusionner les tableaux.

    Dans ton code, pour les 3 premières valeurs, tu renvoies un tableau de 2 éléments, et pour la dernière valeur, tu ne renvoies rien. Perl en déduit donc qu'il faut renvoyer un undef. Il insère donc le undef en fin de tableau fusionné. Problème, tu te retrouves avec un nombre d'éléments impair, du coup quand Perl essaie de convertir le tableau en Hash, il t'affiche un warning "Odd number of elements in hash assignment".

    Pour régler ce problème, tu as 2 solutions. Soit tu conserves ton code initial, mais au lieu de renvoyer undef dans les cas où tu ne veux pas de résultat, tu renvoies un tableau vide (ainsi Perl ajoutera le contenu du tableau vide en fin de tableau fusionné, soit aucun élément, et ainsi le tableau conserve un nombre pair d'éléments):

    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
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %m = ( l => 7, k => 9, y => 10 , p => 46);
     
    my $i = 3;
    my %t = map {   
        if ($i > 0 and exists $m{$_} )  {
            $i--;
            $_ => $m{$_}; 
        }
        else { 
        	() 
        };
    } keys %m;
    print Dumper(\%t);
    Soit tu utilises une méthode en 2 parties :tu récupères les clés avec grep, puis les valeurs avec map:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %m = ( l => 7, k => 9, y => 10 , p => 46);
     
    my $i = 3;
    my @trimedkeys = grep { $i-- > 0 } keys %m;
    my %map = map { $_ => $m{$_} } @trimedkeys;
     
    print Dumper(\%map);
    Enfin, encore une chose à savoir, les hashmaps ne conservent pas l'ordre d'insertion des éléments, donc tu ne les auras pas forcément dans l'ordre l, k, y, p...

    Mais si tu veux, tu peux ajouter "sort" devant "keys" pour avoir les éléments dans l'ordre alphabétique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %m = ( l => 7, k => 9, y => 10 , p => 46);
     
    my $i = 3;
    my @trimedkeys = grep { $i-- > 0 } sort keys %m;
    my %map = map { $_ => $m{$_} } @trimedkeys;
     
    print Dumper(\%map);
    Et finalement, tu as une méthode encore plus rapide en prenant une tranche de tableau des clés (entre l'indice 0 et l'indice $i - 1):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %m = ( l => 7, k => 9, y => 10 , p => 46);
    my $i = 3;
    my %newmap = map { $_ => $m{$_} } (sort keys %m)[0..$i-1];
     
    print Dumper(\%newmap);

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    utilise la fonction grepp du module List-Pairwise :
    http://search.cpan.org/~tdrugeon/List-Pairwise/
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %hash = grepp  { ($a gt 'j') && ($b > 0) } %data;
    ou peu etre que mapp du meme module est plus adapté à ton probleme, que je n'ai pas vraiment cerné
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    J'allais oublier une solution encore plus rapide : considérer la map comme un tableau, et prendre les n*2 premiers éléments :
    (n*2 car clé + valeur = 2 éléments)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %m = ( l => 7, k => 9, y => 10 , p => 46);
    my $i = 3;
    my %map = (%m) [0..($i * 2) - 1];
     
    print Dumper(\%map);

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  5. #5
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Cool merci a vous sa marche niquel
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

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

Discussions similaires

  1. Faire la map d'un site web
    Par Adrien93 dans le forum Langage
    Réponses: 2
    Dernier message: 09/01/2008, 14h10
  2. [Java2D] Aide pour faire une map
    Par Bobator dans le forum 2D
    Réponses: 6
    Dernier message: 31/03/2007, 11h52
  3. Création d'un générateur de map "intelligent" (un
    Par Torpedox dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 30/11/2005, 21h31
  4. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  5. Technique pour faire une map en relief
    Par rvzip64 dans le forum OpenGL
    Réponses: 4
    Dernier message: 28/06/2004, 22h44

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