OVH Cloud OVH Cloud

Problème dans un tableau

7 réponses
Avatar
shivaaz
Bonjour,

mon probl=E8me est tr=E8s simple mais je tourne en rond d=E9sesp=E9rement :

Je voudrait mettre dans un tableau temporaire les valeurs distinct
d'une table de hash.

exemple :
$tarif =3D { 'pain' =3D>0,5
,'beurre' =3D> 2
,'lait' =3D> 2
,'th=E9' =3D> 0,5}

donc dans mon tableau temporaire : $tab[0] vaut 0,5 et $tab[1] vaut 2

en r=E9sum=E9, existe-t-il une fonction (ou autre ) permettant d'avoir un
tableau de valeur distinct ?

merci par avance

7 réponses

Avatar
Nicolas George
"Klaus Eichner" wrote in message
<42e6849e$0$12906$:
$tarif = { 'pain' =>0,5
^^^^^^^

il faut remplacer $tarif par %tarif


Euh, non, pas tel quel : { ... } construit une référence sur un hash
anonyme.


Avatar
Emmanuel Florac
Le Tue, 26 Jul 2005 09:28:33 -0700, shivaaz a écrit :


en résumé, existe-t-il une fonction (ou autre ) permettant d'avoir un
tableau de valeur distinct ?


@tab=values %tab ;

--
on passe la moitié de son temps à refaire ce que l'on n'a pas eu le
temps de faire correctement.
Loi de Myers.

Avatar
Klaus Eichner
"shivaaz" wrote in message
news:

Bonjour,

mon problème est très simple mais je tourne en rond désespérement :

Je voudrait mettre dans un tableau temporaire les valeurs distinct
d'une table de hash.

exemple :
$tarif = { 'pain' =>0,5
^^^^^^^

il faut remplacer $tarif par %tarif

,'beurre' => 2
,'lait' => 2
,'thé' => 0,5}

donc dans mon tableau temporaire : $tab[0] vaut 0,5 et $tab[1] vaut 2

en résumé, existe-t-il une fonction (ou autre ) permettant d'avoir un
tableau de valeur distinct ?

merci par avance


voir les fonctions "each", "keys" et "values" :

http://perl.enstimac.fr/DocFr/perlfunc.html#item_each
http://perl.enstimac.fr/DocFr/perlfunc.html#item_keys
http://perl.enstimac.fr/DocFr/perlfunc.html#item_values

une solution avec "keys":

my @tab;
for (sort(keys(%tarif))) { push @tab, $tarif{$_}; }

--
Klaus

Avatar
Jul
Le Tue, 26 Jul 2005 09:28:33 -0700, shivaaz a écrit :

Bonjour,

mon problème est très simple mais je tourne en rond désespérement :

Je voudrait mettre dans un tableau temporaire les valeurs distinct
d'une table de hash.

exemple :
$tarif = { 'pain' =>0,5
,'beurre' => 2
,'lait' => 2
,'thé' => 0,5}

donc dans mon tableau temporaire : $tab[0] vaut 0,5 et $tab[1] vaut 2

en résumé, existe-t-il une fonction (ou autre ) permettant d'avoir un
tableau de valeur distinct ?

merci par avance


Bonjour,

Si vous souhaitez extraire toutes les valeurs (dont les redondances
possibles), il existe la fonction '@ARRAY = values(%HASH)'.

Si vous souhaitez constituer un tableau de valeurs uniques, il faut la
construire ou compléter la fonction 'values'

Par exemple:


my $tarifs = {...};

my @tarifs = values %$tarifs;

# Remplissage d'un HASH pour obtenir les tarifs uniques.
my %tarifs_uniques;
foreach my $tarif (@tarifs) {
$tarifs_uniques{$tarif} = 1;
};

my @tarifs_uniques_non_ordonnes = keys %tarifs_uniques;
my @tarifs_uniques_croissants = sort keys %tarifs_uniques;

Avatar
Klaus Eichner
"Nicolas George" <nicolas$ wrote in message
news:dc60oo$2c6h$
"Klaus Eichner" wrote in message
<42e6849e$0$12906$:
$tarif = { 'pain' =>0,5
^^^^^^^

il faut remplacer $tarif par %tarif


Euh, non, pas tel quel : { ... } construit une référence sur un hash
anonyme.


Je n'ai pas vu la construction d'une référence à une table de hachage,
(voir aussi
http://perl.enstimac.fr/DocFr/perlreftut.html#construire%20des%20références )

Merci pour la correction.

--
Klaus



Avatar
shivaaz


en résumé, existe-t-il une fonction (ou autre ) permettant d'avoir un
tableau de valeur distinct ?


@tab=values %tab ;

--
on passe la moitié de son temps à refaire ce que l'on n'a pas eu le
temps de faire correctement.
Loi de Myers.




Merci à tous pour vos réponses


Avatar
Paul Gaborit
À (at) 26 Jul 2005 09:28:33 -0700,
"shivaaz" écrivait (wrote):
Je voudrait mettre dans un tableau temporaire les valeurs distinct
d'une table de hash.

exemple :
$tarif = { 'pain' =>0,5
,'beurre' => 2
,'lait' => 2
,'thé' => 0,5}

donc dans mon tableau temporaire : $tab[0] vaut 0,5 et $tab[1] vaut 2

en résumé, existe-t-il une fonction (ou autre ) permettant d'avoir un
tableau de valeur distinct ?


Le mot 'distinct' devrait immédiatement vous inciter à utiliser une
table de hachage.

Donc :

my @tab;
{
my %valeurs_uniques;
foreach my $val (values %$tarif) {
$valeurs_uniques{$val}++;
}
# le 'sort' est là pour avoir les valeurs dans l'ordre.
@tab = sort keys %valeurs_uniques;
}

Ou (en plus synthétique) :

my @tab = sort keys %{{map {$_ => 1} values %$tarif}};

PS: lorsque vous publiez du code dans un message sur le forum, copiez
du vrai code : ça m'étonnerait que votre version de perl utilise la
virgule comme séparateur décimal ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>