Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Swicth / Case

7 réponses
Avatar
Eric BERTHOMIER
Bonjour ,

j'ai utilis=E9 le module SWITH pour =E9crire le code suivant qui me sort
par les yeux !

J'ai essay=E9 plusieurs syntaxes mais ne voit pas comment rendre ce code
plus propre.

switch ($genre) {
case /POLICIER/ { $type_genre=3D1 };
case /POESIE/ { $type_genre=3D1 };
case /ROMAN/ { $type_genre=3D1 };
case /CONTE/ { $type_genre=3D1 };
case /BD/ { $type_genre=3D1 };
case /BANDE DESSINEE/ { $type_genre=3D1 };
case /FANTASTIQUE/ { $type_genre=3D1 };
case /SCIENCE-FICTION/ { $type_genre=3D1 };
case /NOUVELLE/ { $type_genre=3D1 };

case /DOCUMENTAIRE/ { $type_genre=3D2; }
case /RECIT/ { $type_genre=3D2; }
case /BIOGRAPHIE/ { $type_genre=3D2; }


case /PERIODIQUE/ { $type_genre=3D3; }

case /GROS CARACTERES/ { $type_genre=3D4; }
case /DOC BM/ { $type_genre=3D4; }
}

Merci pour votre aide.

7 réponses

Avatar
Paul Gaborit
À (at) Mon, 14 Mar 2011 07:52:53 -0700 (PDT),
Eric BERTHOMIER écrivait (wrote):

j'ai utilisé le module SWITH pour écrire le code suivant qui me sort
par les yeux !



Heu... Le module s'appelle Switch (et non pas switch ou SWITCH ou SWITH).

J'ai essayé plusieurs syntaxes mais ne voit pas comment rendre ce code
plus propre.

switch ($genre) {
case /POLICIER/ { $type_genre=1 };
case /POESIE/ { $type_genre=1 };
case /ROMAN/ { $type_genre=1 };
case /CONTE/ { $type_genre=1 };
case /BD/ { $type_genre=1 };
case /BANDE DESSINEE/ { $type_genre=1 };
case /FANTASTIQUE/ { $type_genre=1 };
case /SCIENCE-FICTION/ { $type_genre=1 };
case /NOUVELLE/ { $type_genre=1 };

case /DOCUMENTAIRE/ { $type_genre=2; }
case /RECIT/ { $type_genre=2; }
case /BIOGRAPHIE/ { $type_genre=2; }


case /PERIODIQUE/ { $type_genre=3; }

case /GROS CARACTERES/ { $type_genre=4; }
case /DOC BM/ { $type_genre=4; }
}



La syntaxe utilisée ci-dessus, me semble très bien... En quoi n'est-ce
pas propre ?

En revanche, puisque vous testez des chaînes constantes et non pas des
expressions régulières, vous pourriez utiliser une table de hachage qui
aura l'intérêt d'être beaucoup plus rapide. Un truc du genre :

my %type_by_genre (
"POLICIER" => 1,
"POESIE" => 1,
"ROMAN" => 1,
"CONTE" => 1,
"BD" => 1,
"BANDE DESSINEE" => 1,
"FANTASTIQUE" => 1,
"SCIENCE-FICTION" => 1,
"NOUVELLE" => 1,
"DOCUMENTAIRE" => 2,
"RECIT" => 2,
"BIOGRAPHIE" => 2,
"PERIODIQUE" => 3,
"GROS CARACTERES" => 4,
"DOC BM" => 4,
);

À définir en début de script et, pouquoi pas, dans une constante (ce que
je n'ai pas fait ici).

Puis quand vous avez $genre qui contient votre genre, vous pouvez
récupérer le type via :

my $type = $type_by_genre{$genre};


--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Benoit Izac
Bonjour,

le 14/03/2011 à 15:52, Eric BERTHOMIER a écrit dans le message
:

J'ai essayé plusieurs syntaxes mais ne voit pas comment rendre ce code
plus propre.

switch ($genre) {
case /POLICIER/ { $type_genre=1 };
case /POESIE/ { $type_genre=1 };
case /ROMAN/ { $type_genre=1 };
case /CONTE/ { $type_genre=1 };
case /BD/ { $type_genre=1 };
case /BANDE DESSINEE/ { $type_genre=1 };
case /FANTASTIQUE/ { $type_genre=1 };
case /SCIENCE-FICTION/ { $type_genre=1 };
case /NOUVELLE/ { $type_genre=1 };

case /DOCUMENTAIRE/ { $type_genre=2; }
case /RECIT/ { $type_genre=2; }
case /BIOGRAPHIE/ { $type_genre=2; }


case /PERIODIQUE/ { $type_genre=3; }

case /GROS CARACTERES/ { $type_genre=4; }
case /DOC BM/ { $type_genre=4; }
}



Avec une version récente de Perl (>= 5.10) :

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
while (<DATA>) {
chomp;
my $genre = $_;
my $type_genre;
given ($genre) {
when (/POLICIER/ or
/POESIE/ or
/ROMAN/ or
/CONTE/ or
/BD/ or
/BANDE DESSINEE/ or
/FANTASTIQUE/ or
/SCIENCE-FICTION/ or
/NOUVELLE/) { $type_genre = 1; }
when (/DOCUMENTAIRE/ or
/RECIT/ or
/BIOGRAPHIE/) { $type_genre = 2; }
when (/PERIODIQUE/) { $type_genre = 3; }
when (/GROS CARACTERES/ or
/DOC BM/) { $type_genre = 4; }
default { $type_genre = 0; }
}
say "genre : $genre, type : $type_genre";
}
__DATA__
UN DOCUMENTAIRE
PAS MAL
OU DE LA SCIENCE-FICTION
MAIS PAS DES GROS CARACTERES
PERIODIQUEMENT

--
Benoit Izac
Avatar
Eric BERTHOMIER
On 14 mar, 17:38, Paul Gaborit wrote:
(at) Mon, 14 Mar 2011 07:52:53 -0700 (PDT),
Eric BERTHOMIER crivait (wrote):

> j'ai utilis le module SWITH pour crire le code suivant qui me sort
> par les yeux !

Heu... Le module s'appelle Switch (et non pas switch ou SWITCH ou SWITH).



> J'ai essay plusieurs syntaxes mais ne voit pas comment rendre ce code
> plus propre.

>            switch ($genre) {
>                    case /POLICIER/                 { $type_genre=1 };
>                    case /POESIE/                   { $type_genre=1 };
>                    case /ROMAN/                    { $type_genre=1 };
>                    case /CONTE/                    { $type_genre=1 };
>                    case /BD/                               { $type_genre=1 };
>                    case /BANDE DESSINEE/   { $typ e_genre=1 };
>                    case /FANTASTIQUE/              { $type_genre=1 };
>                    case /SCIENCE-FICTION/  { $typ e_genre=1 };
>                    case /NOUVELLE/         { $type_genre=1 };

>                    case /DOCUMENTAIRE/     { $t ype_genre=2; }
>                    case /RECIT/                    { $type_genre=2; }
>                    case /BIOGRAPHIE/               { $type_genre=2; }

>                    case /PERIODIQUE/               { $type_genre=3; }

>                    case /GROS CARACTERES/  { $typ e_genre=4; }
>                    case /DOC BM/                   { $type_genre=4; }
>            }

La syntaxe utilis e ci-dessus, me semble tr s bien... En quoi n'est-ce
pas propre ?

En revanche, puisque vous testez des cha nes constantes et non pas des
expressions r guli res, vous pourriez utiliser une table de hachage qui
aura l'int r t d' tre beaucoup plus rapide. Un truc du genre :

  my %type_by_genre =
  (
   "POLICIER"      => 1,
   "POESIE"        => 1,
   "ROMAN"         => 1,
   "CONTE"         => 1,
   "BD"                    => 1,
   "BANDE DESSINEE"  => 1,
   "FANTASTIQUE"     => 1,
   "SCIENCE-FICTION" => 1,
   "NOUVELLE"      => 1,
   "DOCUMENTAIRE"    => 2,
   "RECIT"         => 2,
   "BIOGRAPHIE"            => 2,
   "PERIODIQUE"            => 3,
   "GROS CARACTERES" => 4,
   "DOC BM"        => 4,
  );

d finir en d but de script et, pouquoi pas, dans une constante (ce que
je n'ai pas fait ici).

Puis quand vous avez $genre qui contient votre genre, vous pouvez
r cup rer le type via :

   my $type = $type_by_genre{$genre};

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en fran ais - <http://perl.mines-albi.fr/>



Ce sont bien des expressions régulières, en fait c'est un morceau de
chaîne que je mets.

Je suis habitué à programmer en C, et aurait aimé retrouvé ma synta xe

switch ($genre) {
case /POLICIER/
case /POESIE/
case /ROMAN/
case /CONTE/
{ $type_genre=1 };

Merci
Avatar
espie
In article ,
Eric BERTHOMIER wrote:
Ce sont bien des expressions régulières, en fait c'est un morceau de
chaîne que je mets.

Je suis habitué à programmer en C, et aurait aimé retrouvé ma syntaxe

switch ($genre) {
case /POLICIER/
case /POESIE/
case /ROMAN/
case /CONTE/
{ $type_genre=1 };



Je dirais bien: si tu veux la syntaxe du C, fais du C ! ;)

Plus serieusement, si ton exemple contient les vrais regexps, tu m'as l'air
de vouloir trouver des mots entiers, auquel cas /bPOLICIERb/
serait peut-etre plus approprie (voire meme /bPOLICIERb/i, le cote tout
en majuscule me semble louche).
Avatar
Erwan David
(Marc Espie) écrivait :

In article ,
Eric BERTHOMIER wrote:
Ce sont bien des expressions régulières, en fait c'est un morceau de
chaîne que je mets.

Je suis habitué à programmer en C, et aurait aimé retrouvé ma syntaxe

switch ($genre) {
case /POLICIER/
case /POESIE/
case /ROMAN/
case /CONTE/
{ $type_genre=1 };



Je dirais bien: si tu veux la syntaxe du C, fais du C ! ;)

Plus serieusement, si ton exemple contient les vrais regexps, tu m'as l'air
de vouloir trouver des mots entiers, auquel cas /bPOLICIERb/
serait peut-etre plus approprie (voire meme /bPOLICIERb/i, le cote tout
en majuscule me semble louche).



et
case /POLICIER|POESIE|ROMAN|CONTE/ { $type_genre=1 };

ça ne conviendrait pas ?

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
perlgenome
Bon à savoir : http://perl.developpez.com/faq/perl/?page=sectionB5#sect ionB56
Avatar
espie
In article ,
perlgenome wrote:
Bon à savoir : http://perl.developpez.com/faq/perl/?page=sectionB5#sectionB56



rtfm

man perl5100delta

ca n'est qu'une des ameliorations "recentes" de perl.
Perso, j'utilise encore plus souvent //
Et le fait de pouvoir enfin faire my $_.

Cote securite, chmod/chdir/chown $fh sont un joli cadeau.

Bref, tout ceci est "bon a savoir".