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

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°175709
Gardien
Posté le 12-07-2002 à 13:36:41  profilanswer
 

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

mood
Publicité
Posté le 12-07-2002 à 13:36:41  profilanswer
 

n°175715
Gardien
Posté le 12-07-2002 à 13:50:45  profilanswer
 

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

n°175725
impulse
Posté le 12-07-2002 à 13:59:14  profilanswer
 

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
n°175732
Gardien
Posté le 12-07-2002 à 14:10:14  profilanswer
 

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
}

n°175741
impulse
Posté le 12-07-2002 à 14:18:44  profilanswer
 

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
n°175778
Aricoh
gentil mais fo po pousser
Posté le 12-07-2002 à 15:07:34  profilanswer
 

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
n°175805
Gardien
Posté le 12-07-2002 à 16:12:09  profilanswer
 

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)
 

n°175811
Aricoh
gentil mais fo po pousser
Posté le 12-07-2002 à 16:18:10  profilanswer
 

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
n°175813
Aricoh
gentil mais fo po pousser
Posté le 12-07-2002 à 16:21:39  profilanswer
 

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
n°175837
Gardien
Posté le 12-07-2002 à 17:21:17  profilanswer
 

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

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

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

 

Sujets relatifs
Récupérer le nombre d'enregistrement d'une requête en accessPERL et XML comment parser avec SAX
PERL CGI est securité[HTML] Arrive pas a faire apparaitre ou disparaitre un element DIV
[mysql] nombre d'entree d'une table ?[Perl] Mémoire partagé en multi-thread
[Math] Comment calculer la racine carrée d'un nombre ?[PostgreSQL] Limitation du nombre de caractère pour un titre
[ASP] Nombre de ligne d'un recordset[PHP] Connaître le nombre de jour du mois en cours?
Plus de sujets relatifs à : [PERL] Nombre d'élément d'un hash


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