Nombre d'élément d'un hash [PERL] - Perl - Programmation
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));
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" }
"
^_^
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
}
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: |
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 :
|
donne => my_hash isn't defined
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 ) ou un scalaire
Code :
|
qu'on peut simplifier sacom :
Code :
|
je vois po où se situe exactement le problème
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)
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 :
|
avec ceci :
|
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.
Marsh Posté le 12-07-2002 à 16:21:39
j'avais mal lu ton exemple :
Code :
|
Soit tu fais :
Code :
|
soit tu fais :
Code :
|
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
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 :
|
ou value peut contenir des scalar, des hash et des arrays.
Dans ce dernier cas ,le champ value ressemble à ceci :
Code :
|
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
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