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

  FORUM HardWare.fr
  Programmation
  Perl

  Récupérer la taille d'un tableau associatif

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récupérer la taille d'un tableau associatif

n°1237900
neo00neo
Posté le 03-11-2005 à 17:32:21  profilanswer
 

Bonjour,
mon petit soucis se situe au niveau de la taille d'un tableau associatif.
J'explique :
Je parse un document XML avec la librairie XML::Simple, j'affiche mes résultats avec la fonction Dumper, et je veux créer un petit traitement sur ces résultats. Je dois donc faire une boucle pour lire toutes mes balises, ça marche si j'en ai plusieurs mais pas quand j'en ai qu'une, ça plante au niveau justement du nombre des balises de premier niveau. Voici le code :
 
 
# utiliser le module
use XML::Simple;
use Data::Dumper;
 
use vars qw ( $SAR_env  $SAR_paramsCGI %SAR_session );
 
# On créé une variable pour compter les éléments d'un filtre
my $compteur="0";
 
# creer un objet
my $xml = new XML::Simple;
 
# lire le fichier XML
my $data = $xml->XMLin("filtre.xml" );
 
# afficher le resultat
print Dumper($data)."<br />";
 
print " Taille tableau : ". $data->{element}->{valeur}."<br />";
 
#On fait des tests d'affichage
print "Ce filtre permet de récupérer les alarmes avec ";
foreach my $e (@{$data->{element}})
{
 if ( $compteur == $#{$data->{element}} ){     <-- Ici ça bloque lorsque je n'ai qu'une balise dans mon fichier, c'est la ligne 64.
   ...blablabla... Ce qui se trouve ne pose pas de problème, donc je ne l'ai pas mis...
}
 
 
Maintenant voici mon ficher XML :
<filtre>
 <element attribut="etat" op="=" valeur="HS">
  <separateur_ou op="=" valeur="DEG">
  </separateur_ou>
 </element>
</filtre>
 
Donc si j'ai plusieurs balises "element" ça passe très bien, mais là ça met met l'erreur :
Not an ARRAY reference at /home/sarim/applications/revazur-sarim_1.0/www/perl/supervision/SUPERVISIONLireXML.pl line 64, <GEN2> line 19.
 
Donc là où je vous ai fait le petit commentaire.
Si quelqu'un avait une idée pour m'expliquer, merci.


Message édité par neo00neo le 03-11-2005 à 17:33:07
mood
Publicité
Posté le 03-11-2005 à 17:32:21  profilanswer
 

n°1237990
pospos
Posté le 03-11-2005 à 18:46:29  profilanswer
 

tu a deux possibilité: dans XML-Simple il y a une option genre "force_array" (je me souviens plus du nom) qui oblige à tout mettre dans les references de array meme si il n'y a qu'un seul element.
 
L'autre possibilité est de tester si c'est une ref de array dans ton if:
 
if (ref($data->{element})) { # c'est une ref, et on sais que si c'est uen ref c'est uen ref de array
  $compteur = $#{$data->{element}};
} else {
  # c'est un scalar
  $compteur = 1
}

n°1238135
couak
Posté le 03-11-2005 à 20:40:13  profilanswer
 

pour forcer en tableau :

Code :
  1. my $xml = new XML::Simple(ForceArray => 1);


attention ca force tout en tableau, il est possible de spécifier une liste de balises à forcer en tableau
voir la doc. de XML-Simple http://search.cpan.org/~grantm/XML [...] /Simple.pm

n°1238380
neo00neo
Posté le 04-11-2005 à 08:41:50  profilanswer
 

Ok, d'accord, je vous remercie messieurs.

n°1238412
neo00neo
Posté le 04-11-2005 à 09:57:10  profilanswer
 

Bon après teste de vos deux solutions, ça ne change rien. L'erreur est toujours la même.
Pourtant avec la fonction : ref, je récupère en retour : HASH...
Je ne comprends pas l'erreur là...


Message édité par neo00neo le 04-11-2005 à 09:59:23
n°1238416
pospos
Posté le 04-11-2005 à 10:02:57  profilanswer
 

alors c'est que c'est une ref de hash...
 
utilise Data::Dumper pour y voir plus clair

n°1238434
neo00neo
Posté le 04-11-2005 à 10:15:37  profilanswer
 

Oui, donc quand j'utilise Data:Dumper sur un seul élément j'ai :
$VAR1 = { 'element' => { 'valeur' => 'HS', 'attribut' => 'etat', 'op' => '=', 'separateur_ou' => { 'valeur' => 'DEG', 'op' => '=' } } };  
 
Quand c'est sur deux éléments j'ai :
$VAR1 = { 'element' => [ { 'valeur' => 'HS', 'attribut' => 'etat', 'op' => '=', 'separateur_ou' => { 'valeur' => 'DEG', 'op' => '=' } }, { 'valeur' => 'HS', 'attribut' => 'etat', 'op' => '=', 'separateur_ou' => { 'valeur' => 'DEG', 'op' => '=' } } ] };  
 
 
De plus avec la fonction : ref, lorsque j'ai plus d'un élément au lieu de récupéraer HASH, je récupère ARRAY.
Donc je vois bien que j'ai un tableau qui n'est pas créé, même avec ForceArray il ne se crée pas.
Merci de votre aide.

n°1238458
pospos
Posté le 04-11-2005 à 10:40:07  profilanswer
 

ok donc dans ton if il faut que tu regarde si c'est ARRAY, et sinon tu compte 1

n°1238472
neo00neo
Posté le 04-11-2005 à 10:57:19  profilanswer
 

D'accord, c'est vrai je vais contourner le problème. Mais je ne comprends pas pourquoi ForceArray ne marche pas, voici comment je l'utilise :
my $xml = new XML::Simple(ForceArray => 1);
 
Et pourtant pas de résultat, mais je vais faire comme tu as dis. Merci bien de ton aide.

n°1238543
pospos
Posté le 04-11-2005 à 11:49:15  profilanswer
 

Franchement à chjaque fois que j'ai utilisé XML::Simple ca a été la prise de tete... franchement je l'aime pas ce module, en plus il est super lent...
 
a la limite dans le genre je prefere XML::Mini, qui a une fonction toHash.
Mais bon dans tous les cas ce genre d'approche est souvent relou kand tu sort du cas super simple genre fichier de config. Apres tu a des modules genre XML::Twig qui sont plus abruptes de prime abord mais finalement bcp plus agreables à utiliser sur le long terme

mood
Publicité
Posté le 04-11-2005 à 11:49:15  profilanswer
 

n°1266063
Junt
Posté le 14-12-2005 à 00:39:30  profilanswer
 

J'ai le meme probleme avec Simple::Xml as tu resolu le probleme .
Par exemple si il y aplusieurs resultats j'ai fait un :
      $n=0;
          foreach $appz (@{$var->{package}})
          {
          $package=$var->{package}->[$n];
     $n++;
                  }
 
Or si il n'y a qu'un seul resultat alors il faudrait juste  
$package=$var->{package};
 

n°1266068
Junt
Posté le 14-12-2005 à 01:12:44  profilanswer
 

ok jai trouvé l'info
si ca intéresse du monde
   $data = $xml_category->XMLin(@categories,forcearray => 1, GroupTags => { category => 'package' });
     
    print join(', ', @{$data->{package}} ), "\n";
 
Jai trouvé l'info ici http://perlhelp.web.cern.ch/PerlHe [...] _all_about


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

  Récupérer la taille d'un tableau associatif

 

Sujets relatifs
Coment écrire dans une case d'un tableau [Résolu ]trier plusieurs tableau de mem dimension avec un unique ?
Trier un tableau par date ...Comment ouvrir une fenetre à 30% de la taille de l'écran ??
Javascript qui contrôle la taille d'ouverture d'une fenêtreRécupérer les valeurs boursières...
recuperer une adresse mailrecupere ou mettre a jour un tableau de double dans une classe
ASP pb pour créer un lien qui inclueraient une page dans un tableauOnMouseOver sur texte dans un tableau
Plus de sujets relatifs à : Récupérer la taille d'un tableau associatif


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