[PERL] Tableau de hash

Tableau de hash [PERL] - Perl - Programmation

Marsh Posté le 04-06-2009 à 17:53:34    

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

Reply

Marsh Posté le 04-06-2009 à 17:53:34   

Reply

Marsh Posté le 04-06-2009 à 17:55:52    

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

Reply

Marsh Posté le 04-06-2009 à 18:43:00    

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)

Reply

Marsh Posté le 04-06-2009 à 20:50:21    

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]

Reply

Marsh Posté le 05-06-2009 à 10:22:44    

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

Reply

Marsh Posté le 05-06-2009 à 11:26:10    

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.

Reply

Marsh Posté le 05-06-2009 à 11:45:15    

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"

Reply

Marsh Posté le 10-06-2009 à 14:52:45    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

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