[PERL] Problème avec tableaux / liste imbiqués

Problème avec tableaux / liste imbiqués [PERL] - Perl - Programmation

Marsh Posté le 06-03-2006 à 16:45:45    

Je suis désespéré, je débute en perl et ça me sort déjà par les trous de nez : ça fait plusieurs heures que je me casse la tête sur une utilisation toute conne de tableaux, et je n'y arrive pas du tout  :bounce: !!
 
J'ai super besoin d'aide sur l'utilisation de tableaux imbriqués / listes imbriquées, voici un code d'exemple (qui ne marche pas :( ) ci dessous :
 

Code :
  1. my @liste_site = ('site1','site2');
  2. my @liste_serveur_site1 = ('serveur1');
  3. my @liste_serveur_site2 = ('serveur1','serveur2','server3');
  4. my %tableau_serveur = ('site1'=>[@liste_serveur_site1],'site2'=>[@liste_serveur_site2]);
  5. foreach $site_courant (@liste_site)  {
  6. # ICI OK : le script passe bien pour les 2 sites
  7. # récup' de la liste des serveurs du site courant
  8. @serveurs_du_site = $tableau_serveur{$site_courant};
  9. # pour chaque serveurs du site
  10. foreach $serveur_courant (@serveurs_du_site) {
  11.  #ICI PAS OK : le serveur passe qu'1 fois, et $serveur_courant contient un tableau au lieu de contenir le nom d'un serveur
  12.  print " Serveur ".$serveur_courant." \n";
  13. }
  14. }


 
Ca affiche :
 

Code :
  1. Serveur ARRAY(0x83357dc)
  2. Serveur ARRAY(0x8335800)


 
Alors que je veux :
 

Code :
  1. Serveur serveur1
  2. Serveur serveur1
  3. Serveur serveur2
  4. Serveur serveur3


 :sweat:


Message édité par WhitePoney le 06-03-2006 à 16:49:15

---------------
>>> www.gamewarp.net <<< Toute l'actualité du jeu vidéo au quotidien :) >>> www.generateur35.com <<< Tous les générateurs du Web :D
Reply

Marsh Posté le 06-03-2006 à 16:45:45   

Reply

Marsh Posté le 06-03-2006 à 20:11:19    

Bonsoir,
 
la ligne 11 est erronnée me semble-t-il et tu devrais la remplacer par :
 

Code :
  1. @serveurs_du_site = @{$tableau_serveur{$site_courant}};


 
En Perl, il y a 2 notions TRES importantes à garder en tête :
 
- savoir faire la distinction entre un scalaire $, une liste @ et une liste associative % (ou encore tableau et hachage pour les 2 derniers)
 
- toujours savoir dans quel contexte on se situe lorsqu'on assigne la valeur d'une variable à une autre. Est-on dans un contexte scalaire ou un contexte de liste ?


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 07-03-2006 à 09:39:51    

je rajouterais quelques petites choses :D
- Utilise toujours "use strict;" ça t'évitera de t'emmeler les pinceaux sur pleins de petites betises.
- Utilise Data::Dumper, super pratique quand on bosse sur des tableaux de tableaux pour avoir le contenu exact d'un variable.
- tu te compliques la vie en faisant des trucs comme ça:

Code :
  1. my %tableau_serveur = ('site1'=>[@liste_serveur_site1],'site2'=>[@liste_serveur_site2]);


parce que pour moi ça c'est une hash dont les clés pointes sur des tableaux anonymes ( a cause des crochets), ces mêmes tableaux anonymes contenant des tableaux ( alors qu'il devrait contenir des références sur ces tableaux). Mais on va attendre que master pospos confirme .  
Bref tu te compliques bien la vie avec des références dans tous les sens!  
 
Je sais pas trop ce que tu veux faire exactement, mais ecrit comme ça ton truc marche:

Code :
  1. use strict;
  2.       my @liste_site = ('site1','site2');
  3.       my @liste_serveur_site1 = ('serveur1');
  4.       my @liste_serveur_site2 = ('serveur1','serveur2','server3');
  5.       my %tableau_serveur = ('site1'=>\@liste_serveur_site1,'site2'=>\@liste_serveur_site2);
  6.       foreach my $site_courant (@liste_site)  {
  7.           my $serveurs_du_site = $tableau_serveur{$site_courant};
  8.           foreach my $serveur_courant (@$serveurs_du_site) {
  9.               print "$site_courant  Serveur $serveur_courant \n";
  10.           }
  11.       }


Message édité par anapajari le 07-03-2006 à 09:48:39
Reply

Marsh Posté le 07-03-2006 à 10:07:54    

:hello:  
 
merci à vous, vos suggestions marchent effectivement, je comprends un peut mieux les erreurs de mon script (l'utilisation des variables semble vraiment particulière en perl, je m'enmelle encore les pinceaux avec les @{$}, les @$, les \@ ...).


---------------
>>> www.gamewarp.net <<< Toute l'actualité du jeu vidéo au quotidien :) >>> www.generateur35.com <<< Tous les générateurs du Web :D
Reply

Marsh Posté le 07-03-2006 à 10:39:56    

en fait ce qu'est compliqué c'est les subtilités de notation sur les références.
Sur le "Advanced Perl Programming" de O'Reilly, tu as un syntax summary que je trouve bien fait:

Citation :


References

1. Scalar references:
$ra = \$a;   # reference to scalar
$$ra = 2;    # dereference scalar-ref
$ra = \1.6;  # reference to constant scalar
 
2. Array references:
$rl = \@l;           # reference to existing
$rl = [1,2,3];      # reference to anon. scalar
push (@$rl, "a" ); # Dereference
print $rl->[3]      # 4th element of array pointed to by $rl
 
3. Hash references:
$rh = \%h;                                                 # reference to hash
$rh = {"laurel" => "hardy", "romeo" => "juliet"}; # ref to anon-hash
print keys (%$rh);                                       # Dereference
$x = $rh->{"laurel"};                                    # Arrow notation to extract single element
@slice = @$rh{"laurel","romeo"};                    # Hash slice

4. Code references:

$rs = \&foo;                # reference to existing subroutine foo
$rs = sub {print "foo"}; # reference to anonymous subroutine
                                # (remember the semicolon at the end)
&$rs();                       # dereference: call the subroutine
 
5. Generalized dereferences. Any code inside a block yielding a reference can be dereferenced:
@a = @{foo()}; # dereference the array reference
                       # returned by foo()
 
6. References gotchas. All the examples below are wrong. Always use -w in developing and testing.
@foo = [1,3,4]; # Assigning an array-ref to an array
                      # Use parentheses instead.
%foo = {"foo" => "bar"}; # Assigning a hash-ref to a hash.
                                  # Use parentheses instead.
$foo = \($a, @b); # Identical to $foo = (\$a, \@b)
                         # Assiging an enumerated list to a
                         # scalar yields the last element (so,
                         # $foo gets \@b). Use [ ] if you need
                         # an array reference


Message édité par anapajari le 07-03-2006 à 10:46:36
Reply

Sujets relatifs:

Leave a Replay

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