[Perl] Autoconstruire du code perl dans un switch
Philippe Bruhat (BooK)
philippe.bruhat at free.fr
Mer 3 Juil 13:51:26 CEST 2024
On Wed, Jul 03, 2024 at 09:47:26AM +0200, Patrice Karatchentzeff wrote:
>
> J'ai un code qui fonctionne bien :
>
> while (1) {
> $choice = randomize(3);
>
> switch($choice) {
> case 1 {($search, $target) = ("truc1", "truc2") };
> case 2 {($search, $target) = ("truc3", "truc4")} ;
> case 3 {($search, $target) = ("truc5", "truc6")};
> };
Tu utilises quoi pour le `switch` ? Switch de CPAN ?
> Pour automatiser mon code, j'extrait les « trucs » désormais d'un
> fichier et je les place dans un tableau de tableau. La longueur du
> tableau peut varier selon le nombre de lignes de « trucs ». Je
> voudrais auto-générer le code de mon switch :
>
> while (1) {
> $choice = randomize(scalar(@tab);
> switch($choice) {
> for my $line (0..scalar(@tab) {
> eval case, $line+1, "{(\$search, \$target) =
> (\"$tab[$line][0]\", \"$tab[$line][1]\") }";
> }
> };
Cet `eval` me choque beaucoup. Je pense qu'il ne fait pas du tout ce que
tu veux.
Voici ce que Perl en comprend:
$ perl -MO=Deparse -e 'eval case, $line+1, "{(\$search, \$target) = (\"$tab[$line][0]\", \"$tab[$line][1]\") }";'
eval 'case', $line + 1, qq[{(\$search, \$target) = ("$tab[$line][0]", "$tab[$line][1]") }];
Avec des parenthèse, pour bien voir les priorités :
$ perl -MO=Deparse,-p -e 'eval case, $line+1, "{(\$search, \$target) = (\"$tab[$line][0]\", \"$tab[$line][1]\") }";'
(eval('case'), ($line + 1), (qq[{(\$search, \$target) = ("$tab[$line][0]", "$tab[$line][1]") }]));
> J'ai alors un Bad case statement (invalid case value?).
Si le code evalué est effectivement just `case`, c'est normal d'avoir
une erreur:
$ perl -MSwitch -E 'case'
Bad case statement (invalid case value?) near -e line 1
> $line+1 ne passe pas (si je fais un print à la place du eval, le code
> perl est correct.
Ton print affiche la liste complète de ce qui suit le `eval`.
Il ne débuggue pas le bon problème.
--
Philippe Bruhat (BooK)
Life is a play. The secret is to know your lines, respect the other players
and make a good exit. (Moral from Groo The Wanderer #12 (Epic))
Plus d'informations sur la liste de diffusion Perl