Aller au contenu

[Perl] La galère des tableaux


pierrickg

Messages recommandés

bonjour tous,

les hash et autres tableaux, ça commence à me rendre :smack:

je récupère des données d'une base mysql et je veux construire un tableau qui sera :

%tab[site][lien]=[nom, url]

en faisant:

while ($data = $sth->fetchrow_hashref()) {
$nb_liens++;
# test url
$etat = &check_url($data->{'url'});  
if ($etat eq "ok" ){
 $nb_ok++;
} else {
 push(@bad, $data->{'site_id'});
 push @{ $tab_bad[$data->{'site_id'}] }, $data->{'lien_nom'}, $data->{'url'}; ##### ET LA CA MARCHE PAS
 $nb_bad++;
}  
} 

et je récupère avec

foreach $id (@bad) {
$list_l = '';
 foreach $t ($tab_bad[$id]){
   $list_l .= "$lname - $lurl \n"; ###### ET LA NON PLUS FORCEMENT
}
} 

mais bon voilà, je suis perdu dans un monde multidimensionel d'associations de hash et tableaux :transpi: :whistle:

Comment ajouter à %tab[db->site] le tableau %tab2[db2->lien] contenant lui-même le tableau %lien = (nom, url)

Je pense à séparer en un tableau contenant tous les "lien" par site tab[site]=lien

puis un autre tab2[lien]=[nom, url]

si je peux avoir un coup de main...

Lien vers le commentaire
Partager sur d’autres sites

C'est plutôt du perl+mysql et je c'est pas forcément pour faire un site :transpi:

je récupère des données d'une base mysql et je veux construire un tableau qui sera :

%tab[site][lien]=[nom, url]

Si ça commence par un %, ce n'est pas un tableau, mais une table de hashage.
push(@bad, $data->{'site_id'});

push @{ $tab_bad[$data->{'site_id'}] }, $data->{'lien_nom'}, $data->{'url'}; ##### ET LA CA MARCHE PAS

Ok, la première ligne est claire, tu met le scalaire $data->{'site_id'} à la fin du tableau @bad.

Par contre tu peux m'expliquer ce que tu tentes de faire dans la deuxième ligne ?

Tu devrais aller voir les liens suivants :

Les tables de hashage : http://sylvain.lhullier.org/publications/i...chapitre07.html

Et surtout les références : http://sylvain.lhullier.org/publications/i...chapitre11.html

Lien vers le commentaire
Partager sur d’autres sites

Il y a un truc qui ne marche pas dans le code de theocrite, ou je l'ai mal utilisé. Je fais :

 
my $site_list = {};
while ($data = $sth->fetchrow_hashref()) {
$nb_liens++;
# test url
$etat = &check_url($data->{'url'}); 
if ($etat eq "ok"){
	$nb_ok++;
} else {
	my $h = {};
	#on index chaque url par nom
	$h->{$data->{'lien_nom'}} = $data->{'url'};
	#on index par site (Faire une cle non numerique c'est mieux)
	$site_list->{$data->{'site_id'}} = $h;	
	$nb_bad_liens++;
} 
}
$nb_bad_sites = scalar(keys %$site_list);

my $list_l;
for my $id (keys %{$site_list}) { #en perl 6 plus de foreach
# liste des liens
$list_l = '';
for my $name (keys %{$site_list->{$id}}){
	$list_l .= "'$name' - " . $site_list->{$id}->{$name} . "\n";	
}
print $list_l; ###!!! ET LA JE N'AI QU'UN ENREGISTREMENT MEME QUAND IL Y A PLUSIEURS LIENS FAUX
}

En effet le résultat de la requête est :

$nb_bad_liens = 37

$nb_bad_sites = 17

mais je n'ai qu'un lien dans $list_l par site. Où sont les 20 autres liens ?

Lien vers le commentaire
Partager sur d’autres sites

OK, désolé

en fait c'est un bout de code retravaillé qu'on m'a donné depuis, mais ce n'était pas de théocrite qui ne ferait certainement pas des erreurs de débutant comme cela !

je l'ai utilisé en toute confiance mais fallait pas.

Je ne comprends pas bien. Tu les utilise indifféremment en scalaires et en hashtable.

... moi non plus :incline:

donc avec des %, ça marche sauf que pour chaque site, $list_l contient tous les liens de tous les sites, pas le site en question.

Au niveau du

for my $name (keys %{$site_list->{$id}}){
	$list_l .= "'$name' - " . $site_list->{$id}->{$name} . "\n";	
}

ça doit planter

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...