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

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1319590
WhitePoney
Moi ! Moi m'sieur !
Posté le 06-03-2006 à 16:45:45  profilanswer
 

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
mood
Publicité
Posté le 06-03-2006 à 16:45:45  profilanswer
 

n°1319767
Aricoh
gentil mais fo po pousser
Posté le 06-03-2006 à 20:11:19  profilanswer
 

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
n°1319923
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-03-2006 à 09:39:51  profilanswer
 

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
n°1319942
WhitePoney
Moi ! Moi m'sieur !
Posté le 07-03-2006 à 10:07:54  profilanswer
 

: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
n°1319985
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-03-2006 à 10:39:56  profilanswer
 

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

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

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

 

Sujets relatifs
[Javascript] Problème de rafraichissement d'imageProblème d'import SQL Server 2005 (DTS)
Problème avec un LDAP_BINDProbleme de gestion du son dans flash
Probleme de variables ... [résolu]Problème de récupération de donnée dans une table
Comparer les valeurs de deux tableauxprobleme passage variable page à une autre
[RESOLU] PROB liste chainée d'objet push_back()Probleme avec un script {RESOLU}
Plus de sujets relatifs à : [PERL] Problème avec tableaux / liste imbiqués


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