Discussion:
Swicth / Case
(trop ancien pour répondre)
Eric BERTHOMIER
2011-03-14 14:52:53 UTC
Permalink
Bonjour ,

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

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; }
}

Merci pour votre aide.
Paul Gaborit
2011-03-14 16:38:35 UTC
Permalink
À (at) Mon, 14 Mar 2011 07:52:53 -0700 (PDT),
Post by Eric BERTHOMIER
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).
Post by Eric BERTHOMIER
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/>
Eric BERTHOMIER
2011-03-15 07:55:44 UTC
Permalink
Post by Paul Gaborit
(at) Mon, 14 Mar 2011 07:52:53 -0700 (PDT),
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
  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
   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 syntaxe

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

Merci
Marc Espie
2011-03-15 08:39:07 UTC
Permalink
Post by Eric BERTHOMIER
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 /\bPOLICIER\b/
serait peut-etre plus approprie (voire meme /\bPOLICIER\b/i, le cote tout
en majuscule me semble louche).
Erwan David
2011-03-15 08:41:12 UTC
Permalink
Post by Marc Espie
Post by Eric BERTHOMIER
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 /\bPOLICIER\b/
serait peut-etre plus approprie (voire meme /\bPOLICIER\b/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é
perlgenome
2011-03-24 21:30:17 UTC
Permalink
Bon à savoir : http://perl.developpez.com/faq/perl/?page=sectionB5#sectionB56
Marc Espie
2011-03-24 22:14:58 UTC
Permalink
Post by perlgenome
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".

Benoit Izac
2011-03-14 16:57:52 UTC
Permalink
Bonjour,

le 14/03/2011 à 15:52, Eric BERTHOMIER a écrit dans le message
Post by Eric BERTHOMIER
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
Loading...