[PERL] Nombre d'élément d'un hash

Nombre d'élément d'un hash [PERL] - Perl - Programmation

Marsh Posté le 12-07-2002 à 13:36:41    

Bonjour,
 
Y-a-t'il un moyen simple de tester si un hash est vide ou s'il contient des valeurs (le nombre de valeurs est sans importance).
 
Merci

Reply

Marsh Posté le 12-07-2002 à 13:36:41   

Reply

Marsh Posté le 12-07-2002 à 13:50:45    

J'ai trouvé un truc, si kkun a kkchose de plus efficace qu'il me fasse signe :
 
 
%hash = (...);
 
$nb_el = scalar(keys(%hash));

Reply

Marsh Posté le 12-07-2002 à 13:59:14    

http://www.perl.com/doc/manual/htm [...] fined.html ?
 
"Currently, using defined() on an entire array or hash reports whether memory for that aggregate has ever been allocated. So an array you set to the empty list appears undefined initially, and one that once was full and that you then set to the empty list still appears defined. You should instead use a simple test for size:
 
    if (@an_array) { print "has array elements\n" }
    if (%a_hash)   { print "has hash members\n"   }
"
 
^_^


Message édité par impulse le 12-07-2002 à 14:01:54
Reply

Marsh Posté le 12-07-2002 à 14:10:14    

Lorsque j'execute ceci :
 
%my_hash = undef;
 
if (%my_hash)
{
        print "my_hash is defined\n";
}
else
{
        print "my_hash isn't defined\n";
}
 
J'obtiens l'affichage : my_hash is defined.
 
De plus comme le dis ta citation, si la hash a été remplie puis vidée, ce test échouera (ne donnera pas la réponse que j'attends).
 
Je vais donc rester au test suivant :
 
if ((keys(%my_hash))[0] eq undef)
{
   blablabla
}

Reply

Marsh Posté le 12-07-2002 à 14:18:44    

Citation :

"Currently, using defined() on an entire array or hash reports whether memory for that aggregate has ever been allocated. So an array you set to the empty list appears undefined initially, and one that once was full and that you then set to the empty list still appears defined. You should instead use a simple test for size:
 
   if (@an_array) { print "has array elements\n" }
   if (%a_hash)   { print "has hash members\n"   }
"

 
 
Ma citation ne dit pas tout a fait ce que tu as dit...
Tu n'as pas le meme pb avec ta solution d'ailleurs ?
 
if ((keys(%my_hash))[0] eq undef)  
 
si ton hash contenait des valeurs avant mais qu'il a ete vidé il ne sera pas undef, si :??:
 
^_^
 
EDIT : au fait, ton code marche chez moi =>
 

Code :
  1. #!/opt/perl/bin/perl
  2. %my_hash = ();
  3. unless (%my_hash) {print "my_hash isn't defined\n";}


 
donne => my_hash isn't defined


Message édité par impulse le 12-07-2002 à 14:26:48
Reply

Marsh Posté le 12-07-2002 à 15:07:34    

un hash, tester s'il contient des données, ça se fait de la même manière qu'avec un tableau (pardon, une liste :D) ou un scalaire
 

Code :
  1. if (%toto) {
  2.     print "hash rempli";
  3.     ... # poursuite du traitement
  4. } else {
  5.     die("hash vide a mort !!!" );
  6. }


 
qu'on peut simplifier sacom :
 

Code :
  1. die("hash vide a mort !!!" ) if (! %toto);


 
je vois po où se situe exactement le problème [:mr_jul]


---------------
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 12-07-2002 à 16:12:09    

Ben le prob vient du fait que les tableaux sont initialisés ainsi :
 
@tab = [];
 
et les hash ainsi :
%hash = {}.
 
et qu'ils ne réagissent pas de la même manière aux tests du type :
 
if (@tab) ou if (%hash)
 

Reply

Marsh Posté le 12-07-2002 à 16:18:10    

Un tableau (ou liste) s'initialise avec des () et non des []
 
Attention à ne pas confondre ceci :

Code :
  1. my @tablo = ($pouet, $toto, $titi);
  2. my @tablo[0 .. 2] = ($pouet, $toto, $titi); # idem ligne précédente


 
avec ceci :


@tablo = ();


 
Dans le 1er cas, on initialise le tableau en lui indiquant des valeurs alors que dans le second cas, on vide le contenu du tableau
 
Mais fais gaffe à l'utilisation des [], ça sert pour indicer les éléments d'un tableau mais pour le tableau en lui-même, ça n'est pas avec ça que tu le videra.
 
A noter au passage qu'en Perl, une variable, scalaire, liste ou hash, n'a nullement besoin d'être initialisée au lancement du programme.


---------------
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 12-07-2002 à 16:21:39    

j'avais mal lu ton exemple :

Code :
  1. %my_hash = undef;


 
Soit tu fais :

Code :
  1. undef %my_hash;    # undef est une fonction également en Perl


 
soit tu fais :

Code :
  1. %my_hash = ();


 
Là aussi, contexte de liste (car un hash est une liste améliorée).
 
Si tu fais %my_hash = {}, là je crois pas que ce soit bon car tu dis que ton hash contient une référence anonyme, il contient donc des données. Du coup, ton test qui vérifie si ton hash est rempli, ben ça marche dans ce cas précis :D


Message édité par Aricoh le 12-07-2002 à 16:23:08

---------------
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 12-07-2002 à 17:21:17    

En fait, je suis pas maitre des données que je traite. Elles me sont délivrées par un module sous la forme suivante :
 

Code :
  1. $objet = \(
  2.          {
  3.            type => 'le type',
  4.            name => 'le nom',
  5.            attr => {}, #les attributs
  6.            value => [],
  7.          })


 
ou value peut contenir des scalar, des hash et des arrays.  
 
Dans ce dernier cas ,le champ value ressemble à ceci :
 

Code :
  1. value => [
  2.                     [....]
  3.                   ]


 
Je n'arrive pas à trouver un test ki détermine si le tableau contenue dans value est vide ou non.
 
 
P.S j'aurais du vous donner tout de suite cette structure, on se serait compris plus facilement


Message édité par Gardien le 15-07-2002 à 11:42:23
Reply

Sujets relatifs:

Leave a Replay

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