OVH Cloud OVH Cloud

generer des $q->td avec une boucle

2 réponses
Avatar
Serge Basterot
Bonjour,

Je me suis récemment lancé dans l'écriture d'un CGI en Perl. J'essaye de
générer plusieurs $q->td à l'aide d'une boucle foreach en prenant pour
base un hash mais je n'arrive pas à fermer correctement la série de
balises à la suite de $q->table :

%usersdb = (
user1 => {
domain => "schmurtz.net",
realname => "Toto Machin",
aliases => [ qw( toto tmachin ) ],
}
user2 => {
domain => "gulps.com",
realname => "Bidule Oups"
aliases => [ qw( bidule.oups b.oups ) ],
}
);

my($Domain, $RealName, $user, @Aliases);

print $q->table(
$q->Tr({-align => 'center', -valign => 'top'}, [
$q->th([ "Nom r&eacute;el", "Adresse principale", "Alias" ]); <- ligne 54
foreach $user ( keys %usersdb ) {
$Domain = $usersdb{$user}{domain};
$RealName = $usersdb{$user}{realname};
@Aliases = @{ $usersdb{$user}{aliases} };
print $q->td([ $RealName, $user . "@" . $Domain, @Aliases ]);
}; ]), <- ligne 60
);

Si je fais ça perl me fait :
syntax error at ./cgi_test.pl line 54, near ");"
syntax error at ./cgi_test.pl line 60, near "; ]"

Si je change le ";" en "," à la ligne 54 ça me fait :
syntax error at ./cgi_test.pl line 55, near "foreach "

Dans ces conditions, comment je fais pour fermer ma série de balises
table ? Qu'ai-je fait de mal ?

Merci d'avance,

--
Serge Basterot

2 réponses

Avatar
Jacques Caron
Salut,

On 12 Apr 2005 09:03:46 GMT, Serge Basterot wrote:

Je me suis récemment lancé dans l'écriture d'un CGI en Perl. J'essaye de
générer plusieurs $q->td à l'aide d'une boucle foreach en prenant pour
base un hash mais je n'arrive pas à fermer correctement la série de
balises à la suite de $q->table :

%usersdb = (
user1 => {
domain => "schmurtz.net",
realname => "Toto Machin",
aliases => [ qw( toto tmachin ) ],
}
user2 => {
domain => "gulps.com",
realname => "Bidule Oups"
aliases => [ qw( bidule.oups b.oups ) ],
}
);

my($Domain, $RealName, $user, @Aliases);

print $q->table(
$q->Tr({-align => 'center', -valign => 'top'}, [
$q->th([ "Nom r&eacute;el", "Adresse principale", "Alias" ]); <-
ligne 54
foreach $user ( keys %usersdb ) {
$Domain = $usersdb{$user}{domain};
$RealName = $usersdb{$user}{realname};
@Aliases = @{ $usersdb{$user}{aliases} };
print $q->td([ $RealName, $user . "@" . $Domain, @Aliases ]);
}; ]), <- ligne 60
);

Si je fais ça perl me fait :
syntax error at ./cgi_test.pl line 54, near ");"
syntax error at ./cgi_test.pl line 60, near "; ]"


Relativement normal, il manquerait alors toutes sortes de ] et de )...

Si je change le ";" en "," à la ligne 54 ça me fait :
syntax error at ./cgi_test.pl line 55, near "foreach "


normal, foreach est une instruction de contrôle de flux, on ne peut pas la
mettre au milieu d'une liste. Ce qu'il te faut ici c'est un map:

print $q->table(
$q->Tr(
{-align => 'center', -valign => 'top'},
[
$q->th([ "Nom r&eacute;el", "Adresse principale", "Alias" ]),
map {$q->td([ $usersdb{$_}{domain}, $_ . "@" . $usersdb{$_}{domain},
join ", ",@{$usersdb{$_}{aliases}}])} keys %usersdb,
]
),
);

J'ai pas essayé, mais ça devrait pas être très loin de la réalité.

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/

Avatar
Serge Basterot
On 2005-04-12, Jacques Caron wrote:
On 12 Apr 2005 09:03:46 GMT, Serge Basterot wrote:
mais je n'arrive pas à fermer correctement la série de
balises à la suite de $q->table :



[...]

normal, foreach est une instruction de contrôle de flux, on ne peut pas la
mettre au milieu d'une liste. Ce qu'il te faut ici c'est un map:


[...]

J'ai pas essayé, mais ça devrait pas être très loin de la réalité.


Merci, ça fonctionne à merveille, pile-poil :-) Maintenant faut que je
me renseigne sur ce map.

@+

--
Serge