[Perl] Autoconstruire du code perl dans un switch

Patrice Karatchentzeff patrice.karatchentzeff at gmail.com
Mer 3 Juil 17:13:42 CEST 2024


Bon, j'améliore un peu mon truc... Comme dit Stéphane, il y avait bien
un effet de bord dans l'exemple que j'ai mis ici (il n'est pas iso à
mon code) :

$choice = randomize(scalar(@SEO));

  switch($choice) {
    for my $line (0..scalar(@SEO)-1) {
      my $case= $line+1;
      eval qq!case  $case  {(\$search, \$target) =
(\"$SEO[$line][0]\", \"$SEO[$line][1]\")};!;
      warn $@ if $@;
      print qq!case  $case  {(\$search, \$target) =
(\"$SEO[$line][0]\", \"$SEO[$line][1]\")};!, "\n";
    };

L'utilisation de qq!! améliore un peu les choses, mais cette fois j'ai
l'erreur :

Number found where operator expected at (eval 216) line 1, near "case  1"
    (Do you need to predeclare case?)
syntax error at (eval 216) line 1, near "case  1"
case  1  {($search, $target) = ("truc1", "truc2")};

(remarquez que le résultat du print est conforme à ce que je veux passer à eval)

Si je comprends bien cette erreur (merci Gabor :
https://perlmaven.com/scalar-found-where-operator-expected), la
liaison entre les différents éléments de la liste ne sont pas bien
collés : il faudrait techniquement un . (ce qui me semble était fait
par le qq!!).

Le mer. 3 juil. 2024 à 09:47, Patrice Karatchentzeff
<patrice.karatchentzeff at gmail.com> a écrit :
>
> Salut,
>
> 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")};
>   };
>
> 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]\") }";
> }
>   };
>
> J'ai alors un Bad case statement (invalid case value?). Donc le
> $line+1 ne passe pas (si je fais un print à la place du eval, le code
> perl est correct.
>
> Qu'est-ce que je rate ?
>
> Merci
>
> PK
>
> --
>       |\      _,,,---,,_           Patrice KARATCHENTZEFF
> ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff at gmail.com
>      |,4-  ) )-,_. ,\ (  `'-'
>     '---''(_/--'  `-'\_)



-- 
      |\      _,,,---,,_           Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff at gmail.com
     |,4-  ) )-,_. ,\ (  `'-'
    '---''(_/--'  `-'\_)


Plus d'informations sur la liste de diffusion Perl