À (at) Wed, 04 Jan 2012 04:08:52 +0100,
Chloe Sival <
chloe...@gmail.com> écrivait (wrote):
> Debutant en perl, j'utilise actuellement:
>
> if (($cpostal =~ /^01/) || ($cpostal =~ /^03/) || ($cpostal =~
> /^07/) || ($cpostal =~ /^15/) || ($cpostal =~ /^26/) || ($cpostal =~
> /^42/) || ($cpostal =~ /^43/) || ($cpostal =~ /^63/) || ($cpostal =~
> /^69/) || ($cpostal =~ /^75/) || ($cpostal =~ /^77/) || ($cpostal =~
> /^78/) || ($cpostal =~ /^91/) || ($cpostal =~ /^92/) || ($cpostal =~
> /^93/) || ($cpostal =~ /^94/) || ($cpostal =~ /^95/)) {
>
> pour lancer une instruction si le code postal ce trouve dans un
> certain departement.
Plutot que des tonnes de parenthèses et les opérateurs '||' et '&&',
utilisez plutôt les opérateurs 'or' et 'and' :
if ($cpostal =~ /^01/ or $cpostal =~ /^03/ ...
> Je voulais savoir si il n'y aurais pas une methode plus propre et plus
> clair au niveau code source, style:
>
> @departements_concernes = (01,03,15,26,43,63,75,77,91,92,94,95)
> if ($cpostal =~ /^$departements_concernes/) { xx
Ici, le 01 pose problème car, comme tous les autres, il est interprété
comme un nombre et donnera 1 (au lieu de 01). Il faut donc utiliser une
liste de mots et non une liste de nombres.
Première solution : pour le test, utilisez une expression
rationnelle. Ce qui donne :
my @departements_concernes
= qw/01 03 15 26 43 63 75 77 91 92 94 95/;
my $dc_regex = join "|", @departements_concernes;
if ($cpostal =~ m/^(?:$dc_regex)/) {
...
}
Deuxième solution : utiliser le module List::Util et sa fonction
first. Ce qui donne :
use List::Util qw/first/;
...
my @departements_concernes
= qw/01 03 15 26 43 63 75 77 91 92 94 95/;
if (first {$cpostal =~ m/^$_/} @departements_concernes) {
...
}
Troisième solution : créer une table de hachage donc les clés sont les
numéros des départements acceptables puis chercher une clé correspondant
aux deux premiers caractères du code postal extraits via la fonction
substr. Ce qui donne :
my @departements_concernes
= qw/01 03 15 26 43 63 75 77 91 92 94 95/;
my %dc = map {($_ => 1)} @departements_concernes;
if (defined $dc{substr($cpostal,0,2)}) {
...
}
Personnellement, j'utilise très souvent cette dernière solution.
--
Paul Gaborit - <
http://perso.mines-albi.fr/~gaborit/>
Perl en français - <
http://perl.mines-albi.fr/>