Moyen plus simple d'ecrire ?

Le
Chloe Sival
Bonjour,

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.

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


merci d'avance pour vos suggestion ;=)
Chloé
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
gerbier
Le #24126861
Le 04/01/2012 04:08, Chloe Sival a écrit :
Bonjour,

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.

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



j'aime bien les tables de hashage pour ça :

%departements_concernes = ( 1 => 1, 3 => 1, 7 => 1, ... 95 => 1);

if (exists $departements_concernes{$cpostal} ) {
}
luc2
Le #24126611
if( $cpostal =~ /^(01|03|07|15|etc.)/ )
{
...
}

Le 04-01-2012, Chloe Sival
Bonjour,

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.

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


merci d'avance pour vos suggestion ;=)
Chloé
azrazer
Le #24126661
Bonjour,
voilà une autre solution si vous voulez plutôt utiliser une liste
réutilisable par la suite

grep évalue un block d'instruction pour chaque élément d'un tableau (et
au sein du block, $_ prend successivement les valeurs des tableaux).
Dans un contexte scalaire (c'est le cas de la condition dans un if()),
elle renvoie le nombre de fois où le block est évalué à vrai.

ainsi dans votre code, vous pouvez définir
my @departements_concernes =qw/01 03 15 26 43 63 75 77 91 92 94 95/;
en début de fichier (c'est un tableau de chaines de caractères, si on
utilise un tableau sans spécifier que ce sont des chaines de caractères,
01 devient 1 dans beaucoup de contextes)

puis utiliser if (grep {$cpostal =~ /^$_/} @departements_concernes) {blabla}


Cordialement,
(ci-dessous un exemple)
azra.

----------------

use strict;
use warnings;

my @departements_concernes =qw/01 03 15 26 43 63 75 77 91 92 94 95/;

while (my $cpostal= <DATA>){
if (grep {$cpostal =~ /^$_/} @departements_concernes) {
print $cpostal;
}
}
__DATA__
01
01578
0401157
635798
95487
0115

---------------------

Le 04/01/2012 04:08, Chloe Sival a écrit :
Bonjour,

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.

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


merci d'avance pour vos suggestion ;=)
Chloé
Paul Gaborit
Le #24126851
À (at) Wed, 04 Jan 2012 04:08:52 +0100,
Chloe Sival
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 - Perl en français -
Chloe Sival
Le #24130011
Le 04/01/2012 10:14, Paul Gaborit a écrit :
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.



Nickel merci pour vos reponses, j'ai testé avec succes la troisieme
solution.

Une question: si je veux utiliser l'instruction (defined
$dc{substr($cpostal,0,2)}) avec de or/and/||/&& cela ce passe comment ?

j'ai créé:
@departements_concernes_zone_a
@departements_concernes_zone_b

avec comme objectifs,
si $cpostal est en zone A et pas en Zone B = instruction 1
si $cpostal est en zone A et en Zone B = instruction 2

merci d'avance
Chloe
Paul Gaborit
Le #24130321
À (at) Thu, 05 Jan 2012 05:12:45 +0100,
Chloe Sival
Une question: si je veux utiliser l'instruction (defined
$dc{substr($cpostal,0,2)}) avec de or/and/||/&& cela ce passe comment
?
j'ai créé:
@departements_concernes_zone_a
@departements_concernes_zone_b




Comme n'importe quelle autre condition, à partir du moment où les deux
tables de hachages %dc_a et %dc_b sont créées. Exemple :

if (defined $dc_a{$substr($cpostal,0,2)}
and not defined $dc_b{substr($cpostal,0,2)}) {
...
}

--
Paul Gaborit - Perl en français -
tfe
Le #24275941
On 4 jan, 04:08, Chloe Sival
Bonjour,

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.

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

merci d'avance pour vos suggestion ;=)
Chlo



Bonjour,

Tu peux créer une regex dynamiquement aussi:
@departements_concernes = (01,03,15,26,43,63,75,77,91,92,94,95) ;
my $regex = join "|", @departements_concernes;
if(/$regex/) {
# print "OK CA MARCHE...";
}

--
tfe
http://tfeserver.fr
Publicité
Suivre les réponses
Poster une réponse
Anonyme