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

Récupérer la taille d'un tableau associatif - Perl - Programmation

Marsh Posté le 03-11-2005 à 17:32:21    

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
Reply

Marsh Posté le 03-11-2005 à 17:32:21   

Reply

Marsh Posté le 03-11-2005 à 18:46:29    

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
}

Reply

Marsh Posté le 03-11-2005 à 20:40:13    

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

Reply

Marsh Posté le 04-11-2005 à 08:41:50    

Ok, d'accord, je vous remercie messieurs.

Reply

Marsh Posté le 04-11-2005 à 09:57:10    

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
Reply

Marsh Posté le 04-11-2005 à 10:02:57    

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

Reply

Marsh Posté le 04-11-2005 à 10:15:37    

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.

Reply

Marsh Posté le 04-11-2005 à 10:40:07    

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

Reply

Marsh Posté le 04-11-2005 à 10:57:19    

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.

Reply

Marsh Posté le 04-11-2005 à 11:49:15    

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

Reply

Marsh Posté le 04-11-2005 à 11:49:15   

Reply

Marsh Posté le 14-12-2005 à 00:39:30    

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};
 

Reply

Marsh Posté le 14-12-2005 à 01:12:44    

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

Reply

Sujets relatifs:

Leave a Replay

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