Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1323 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Tableau de hash

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PERL] Tableau de hash

n°1891383
bichtoubar​d
Posté le 04-06-2009 à 17:53:34  profilanswer
 

Bonjour,
 
Voilà j'ai une liste du genre
 
Bloc1;Machine1
Bloc2;Machine1
;Machine3
Bloc3;Machine2
Bloc3;Machine2
;Machine1
 
Ce que j'aimerai faire en perl, c'est me sortir la liste des bloc par machine.
 
J'ai essayé un truc tout bête, et pour une fois de faire ça propre :
 

Code :
  1. #!/usr/bin/perl
  2. open(F, "machines.csv" );
  3. my %m = {};
  4. while (<F> ) {
  5. chomp();
  6. my @ligne = split(";" );
  7. my $line1 = @ligne[1];
  8. my $line0 = @ligne[0];
  9. if ($m{$line1}) {
  10. $m{$line1} .= $line0;
  11. } else {
  12.   $m{$line1} = $line0;
  13. }
  14. }
  15. close(F);
  16. foreach my $k (keys(%m))
  17. {
  18. print "clef=$k valeur=$m{$k}\n";
  19. }


 
Et pourtant ça fonctionne pas, le résultat donne un truc du genre :
 

Code :
  1. valeur= 46
  2. valeur=DSI
  3. valeur=BA03
  4. valeur=DSI
  5. valeur=BA07
  6. valeur=BA04
  7. valeur=BA02BA02BA02BA01
  8. valeur=BA11BA08BA11BA07BA09BA09BA01DOSSI


 
Le pire c'est que ça n'affiche même pas "clé".
 
Avez vous une idée de l'erreur dans le code ?
 
Merci

mood
Publicité
Posté le 04-06-2009 à 17:53:34  profilanswer
 

n°1891386
Elmoricq
Modérateur
Posté le 04-06-2009 à 17:55:52  profilanswer
 

@ligne[1] => $ligne[1]

n°1891391
bichtoubar​d
Posté le 04-06-2009 à 18:43:00  profilanswer
 

J'affiche @ligne[1] ça ne pose aucun problème..
De plus quand je passe par $ligne[1]
 
Donc  
 

Code :
  1. my $ligne = split(";" );
  2. if ($m{$ligne[1]}) {
  3. $m{$ligne[1]} .= $ligne[0];
  4. } else {
  5.   $m{$ligne[1]} = $ligne[0];
  6. }
  7. }


 
J'ai pas plus de succès (enfin à vérifier quand même je peux pas là, mais je faisais comme ça au départ)

n°1891414
couak
Posté le 04-06-2009 à 20:50:21  profilanswer
 

c'est marrant moi j'ai compris que tu veux un hash de tableaux
si c'est bien un hash de tableaux je te propose ca :

Code :
  1. #!/usr/bin/perl
  2.  
  3. use Data::Dumper;
  4.  
  5. open INPUT, "input.txt";
  6. my @all_lines = <INPUT>;
  7. close INPUT;
  8.  
  9. my $CONF = { };
  10. foreach $line (@all_lines)
  11. {
  12.        chomp($temp = $line);
  13.        my @splitted = split (";", $temp);
  14.        push (@{$CONF->{@splitted[1]}}, @splitted[0]);
  15. }
  16.  
  17. print Dumper $CONF;


 
ca te donne un résultat comme ceci :

Code :
  1. $VAR1 = {
  2.          'Machine3' => [
  3.                          ''
  4.                        ],
  5.          'Machine2' => [
  6.                          'Bloc3',
  7.                          'Bloc3'
  8.                        ],
  9.          'Machine1' => [
  10.                          'Bloc1',
  11.                          'Bloc2',
  12.                          ''
  13.                        ]
  14.        };


perso pour travailler sur des hash et des listes, je préfère utiliser les références, plus efficace mais surtout beaucoup plus lisible
Pour accéder au tableau de la clé "Machine1" tu fais :

Code :
  1. $CONF->{ 'Machine1' }


Pour accéder au 1er élément du tableau de la clé "Machine1" tu fais :

Code :
  1. $CONF->{ 'Machine1' }->[0]

n°1891543
bichtoubar​d
Posté le 05-06-2009 à 10:22:44  profilanswer
 

Merci beaucoup pour ton aide, ça fonctionne.
 
J'aurai bien aimé connaître le problème dans mon code toutefois, mais ta solution me permet de bosser :)
 
Et merci aussi pour les conseils, j'en prend bonne note

n°1891585
bichtoubar​d
Posté le 05-06-2009 à 11:26:10  profilanswer
 

Bon j'ai compris mon erreur, un bon truc de novice :(
 
En fait j'importais mon CSV depuis Windows, donc il restait des "control M" en trop.
Je les ai supprimé du fichier et là je peux faire fonctionner mon code.
 
Je pensais que chomp() supprimait cela justement.

n°1891603
couak
Posté le 05-06-2009 à 11:45:15  profilanswer
 

chomp() ne supprimer pas le ^M mais une regex te permet de le faire
 
astuce : pour écrire le ^M avec un éditeur sous unix, tu fais "CTRL+V" puis "CTRL+M"

n°1893635
gilou
Modérateur
Modzilla
Posté le 10-06-2009 à 14:52:45  profilanswer
 

Sinon, il y a aussi ce qui suit, mais bon :whistle:  

Spoiler :

http://hfr-rehost.net/4.bp.blogspot.com/_lpk4Y3xUVjw/SeIRwToSRoI/AAAAAAAAATs/kMeGCjZmj8E/s400/Giant+Painting_Large.jpg


 
 [:dehors]  
A+,


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Tableau de hash

 

Sujets relatifs
Tri d'un tableau par indexationaffichage de double requetes dans un seul tableau
affichage de double requetes dans un seul tableauAcceder à un tableau via une seule variable via un pointeur?
Créer un formulaire et récupérer les données saisies ds un tableauRécupérer des données d'un menu déroulant en Perl
tableau en PHP4 avec 4 indxesPasser un tableau ou une hash Perl à JavaScript
[perl] tableau et hash[Perl] itérer sur les valeurs d'un tableau de hash de hash...
Plus de sujets relatifs à : [PERL] Tableau de hash


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR