[PERL] la commande push et une table de hash [Résolu/Fermé]

Signaler
Messages postés
2
Date d'inscription
dimanche 4 novembre 2007
Statut
Membre
Dernière intervention
5 novembre 2007
-
 nadjiboooo -
Bonjour,

je m'excuse par avance si la réponse a déjà été donnée, j'ai cherché (rapidement) et je n'ai pas trouvé.

Voici mon problème :

- j'ai un fichier CSV que je met dans une table de hachage pour pouvoir le manipuler. Je lis le fichier ligne par ligne et en séparant avec split et j'affecte mes valeurs dans une table de hachage.

- je veux ensuite garder mes tables de hachage créées à chaque ligne dans un tableau.

je fais donc un push (@tab,{%hash});

Mais mon tableau ne récupère que le pointeur vers cette table de hachage, ce qui est nettement plus embetant pour moi.





Est il possible avec la commande push d'affecter à mon tableau une table de hachage (clés et valeurs) plutot que l'adresse du pointeur ?




Merci d'avance

Cdt.

3 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 543
Salut,

en fait tu ne sais pas accéder à ton hash

Voici un exemple, à toi d'adapter
#!/usr/bin/perl
use strict;use warnings;

my (@tab, %h1, %h2);

%h1 = (
        cle1 => 'toto',
        cle2 => 'titi',
      );

%h2 = (
        cle3 => 'tata',
        cle4 => 'tutu',
      );

push @tab,\%h1,\%h2;

foreach (@tab){
        foreach my $k(sort keys %{$_}){
                print "$k => $_->{$k}\n";
        }
}
voici une table de hash :(vous pouvez facilement ajout les inf dans les truct)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct el
{
char cle[10];
struct el *suiv;
}m;
m *table[20]; char ch[10],ac[10]; int x;

int hash(void)
{
int d,h,j; h=0;
for(d=0;ch[d];d++)
{
j=ch[d];
h+=j;
}
h=(h*d)%20;

return(h);
}
m* recherche(int i)
{m *l;
for(l=table[i];l!=NULL&&strcmp(l->cle,ch)!=0;l=l->suiv);
return(l);
}



m* cree()
{m *l;
l=(m*)malloc(sizeof(m)); l->suiv=NULL; strcpy(l->cle,ch);
return(l);
}


int action()
{
int u,i; u=ac[0];i=u-48;
while(strlen(ac)!=1||i>3||i<0)
{
printf("\nrelire les remarques ci dessus et apres rentrer votre action :");scanf("%s",ac); u=ac[0];i=u-48;
}
return(i);
}




main()
{
m *r,*s;
int i,j,h,act;
for(i=0;i<20;i++)
table[i]=NULL;
printf("\n\n\n\ndes remarques sur les actions du programme : ");
printf("\n\n pour inserer une tel element taper 1 ");
printf("\n pour rechercher un tel element s'il existe taper 2 ");
printf("\n pour supprimer un tel element taper 3");
printf("\n pour sorter que le programme taper 0 ");
printf("\n\n choisir votre action : "); scanf("%s",ac); act=action();
while(act==1||act==2||act==3)
{
if(act==1)
{
printf("\nentre votre cle : ");scanf("%s",ch); h=hash();; r=recherche(h);
if(r!=NULL)printf("\ncette cle est existe deja !!");
else
{
s=cree();
s->suiv=table[h]; table[h]=s;
for(s=table[h];s!=NULL;s=s->suiv)printf("[%s]",s->cle);
}
}/*if(act==1)*/
if(act==2)
{
printf("\nentre la cle recherchee : "); scanf("%s",ch); h=hash(); r=recherche(h);
if(r!=NULL)printf("\nla cle '%s' ets existe ",r->cle);
else
{
printf("\ncette cle n'existe pas voullez vous l'inseree ?(oui=1/non=0) : "); scanf("%d",&i);
if(i==1)
{
s=cree();
s->suiv=table[h]; table[h]=s;
}
}
}/*if(act==2)*/
if(act==3)
{
printf("\nentre la cle que voulez supprimer : "); scanf("%s",ch); h=hash(); r=recherche(h);
if(r==NULL)printf("\ncette cle n'existe pas !!");
else
{
if(strcmp(table[h]->cle,ch)==0)
{
s=table[h]; table[h]=s->suiv; free(s);
}
else
{
for(s=table[h];s->suiv!=r;s=s->suiv);
s->suiv=r->suiv; free(r);
}
}
}/*if(act==3)*/
printf("\n\n choisir votre action : "); scanf("%s",ac); act=action();
}/*while(act==1||act==2)*/
}/*main*/
et pour plus d'information sur c++ (www.nadjiboooo@gmail.com)
Messages postés
2
Date d'inscription
dimanche 4 novembre 2007
Statut
Membre
Dernière intervention
5 novembre 2007

Merci,

en fait j'ai utilisé cette façon de faire, mais en faisant directement une table de hachage de tables de hachage, cela revient quasiment au même en fait.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 543
Salut,

affiche ton code pour voir, ainsi qu'une partie de fichier que tu traites.
quelques explications pour comprendre ce que tu veux faire seront bienvenues.