[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