OVH Cloud OVH Cloud

Expression relationnel & les accents (`´^¨)

5 réponses
Avatar
ZigZag15551
Expression relationnel & les accents (`´^¨)

Vous l'aurez compris je cherche une manière plus élégante pour supprimer les
caractères (`´^¨) d'une chaine de texte !

En fait, j'aimerais pouvoir les détecter dans l'expression relationnel mais
sans les tester un à un !

### Voilà le script en question ! ###

#!/usr/bin/perl
print "Content-type: text/html\n\n<html><pre>\n";
&check_keyword("Dîtes-vous que l'on peut tout faire en Perl : gérer des
formulaires, des commandes, des boutiques virtuelles, des paiements
sécurisés, des bases de données (Mysql, Oracle, Db2, etc) envoyer des
e-mails, écrire dans des fichiers, on en passe et des meilleurs !");
############################## - ??
sub check_keyword {
my $str = lc($_[0]);
my $i=0;
my @accentuated =
('à','â','ä','ç','è','é','ê','ë','ì','î','ï','ò','ô','ö','ù','û','ü');
my @not_accentuated =
('a','a','a','c','e','e','e','e','i','i','i','o','o','o','u','u','u');
foreach $accentuated (@accentuated){
$str =~ s/$accentuated/$not_accentuated[$i]/g;
$i++;
}

my @keyword;
while($str =~ /([\w]*)/g){
if(length($1) > 6 && length($1) < 11){
push @keyword,$1;
}
}

foreach $keyword (@keyword){
print "$keyword\n"; # Action
}
}
############################## - !!

print "</pre></html>\n";


--
Merci.

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

ZigZag15551@hotmail.com

5 réponses

Avatar
jl_morel
Dans l'article <4AwQb.111834$, zigzag15551
@hotmail.com a dit...

Expression relationnel & les accents (`´^¨)

Vous l'aurez compris je cherche une manière plus élégante pour supprimer les
caractères (`´^¨) d'une chaine de texte !

En fait, j'aimerais pouvoir les détecter dans l'expression relationnel mais
sans les tester un à un !

### Voilà le script en question ! ###

[couic]


Utilisez l'opérateur de translitération et travaillez directement sur les
listes. Par exemple :

#!/usr/bin/perl
print "Content-type: text/htmlnn<html><pre>n";
&check_keyword("Dîtes-vous que l'on peut tout faire en Perl : gérer des
formulaires, des commandes, des boutiques virtuelles, des paiements
sécurisés, des bases de données (Mysql, Oracle, Db2, etc) envoyer des
e-mails, écrire dans des fichiers, on en passe et des meilleurs !");
############################## - ??
sub check_keyword {
$_ = lc shift;
tr/àâäçèéêëìîïòôöùûü/aaaceeeiiiooouuu/;
my @keyword = grep {length($_)>6 and length($_)<11} split /W/;
print "$_n" foreach @keyword;
}
############################## - !!

print "</pre></html>n";

__END__

--
J-L.M.

Avatar
ZigZag15551
Merci !

Encore une petite question !
Selon vous laquelle de c'est deux options est la meilleur et pourquoi ?
(Rapidité d'execution, lisibilité ???)

### 1er ###
sub str2num {
$_ = shift;

s/[ABCabc]/2/g;
s/[DEFdef]/3/g;
s/[GHIghi]/4/g;
s/[JKLjkl]/5/g;
s/[MNOmno]/6/g;
s/[PRSprs]/7/g;
s/[TUVtuv]/8/g;
s/[WXYwxy]/9/g;

return $_;
}
### ou 2e ###

sub str2num {
$_ = shift;

tr/ABCabcDEFdefGHIghiJKLjklMNOmnoPRSprsTUVtuvWXYwxy/222222333333444444555555
666666777777888888999999/;

return $_;
}

###

Et j'ai remarqué que vous m'avez corrigé ! Est t-il vraiment mieux d'utilisé
:

1. "shift" plutôt que "$_[0]" ?

2. "and" plutôt que "||" ?

3. my @keyword = grep {length($_)>6 and length($_)<11} split /W/;

plutôt que

my @keyword;
while($str =~ /([w]*)/g){
if(length($1) > 6 && length($1) < 11){
push @keyword,$1;
}
}

Ou est-ce simplement une question de goût ?

PS. Je sais que ça fait plus d'une question mais je suis de nature curieuse
! :o)

Merci.



"Jean-Louis MOREL" a écrit dans le message de
news:buuckh$pdc$
Dans l'article <4AwQb.111834$,
zigzag15551

@hotmail.com a dit...

Expression relationnel & les accents (`´^¨)

Vous l'aurez compris je cherche une manière plus élégante pour supprimer
les


caractères (`´^¨) d'une chaine de texte !

En fait, j'aimerais pouvoir les détecter dans l'expression relationnel
mais


sans les tester un à un !

### Voilà le script en question ! ###

[couic]


Utilisez l'opérateur de translitération et travaillez directement sur les
listes. Par exemple :

#!/usr/bin/perl
print "Content-type: text/htmlnn<html><pre>n";
&check_keyword("Dîtes-vous que l'on peut tout faire en Perl : gérer des
formulaires, des commandes, des boutiques virtuelles, des paiements
sécurisés, des bases de données (Mysql, Oracle, Db2, etc) envoyer des
e-mails, écrire dans des fichiers, on en passe et des meilleurs !");
############################## - ??
sub check_keyword {
$_ = lc shift;
tr/àâäçèéêëìîïòôöùûü/aaaceeeiiiooouuu/;
my @keyword = grep {length($_)>6 and length($_)<11} split /W/;
print "$_n" foreach @keyword;
}
############################## - !!

print "</pre></html>n";

__END__

--
J-L.M.




Avatar
ZigZag15551
petite erreur ici bas

"and" plutôt que "&&"

oups !!

"ZigZag15551" a écrit dans le message de
news:hxAQb.113692$
Merci !

Encore une petite question !
Selon vous laquelle de c'est deux options est la meilleur et pourquoi ?
(Rapidité d'execution, lisibilité ???)

### 1er ###
sub str2num {
$_ = shift;

s/[ABCabc]/2/g;
s/[DEFdef]/3/g;
s/[GHIghi]/4/g;
s/[JKLjkl]/5/g;
s/[MNOmno]/6/g;
s/[PRSprs]/7/g;
s/[TUVtuv]/8/g;
s/[WXYwxy]/9/g;

return $_;
}
### ou 2e ###

sub str2num {
$_ = shift;


tr/ABCabcDEFdefGHIghiJKLjklMNOmnoPRSprsTUVtuvWXYwxy/222222333333444444555555

666666777777888888999999/;

return $_;
}

###

Et j'ai remarqué que vous m'avez corrigé ! Est t-il vraiment mieux
d'utilisé

:

1. "shift" plutôt que "$_[0]" ?

2. "and" plutôt que "||" ?

3. my @keyword = grep {length($_)>6 and length($_)<11} split /W/;

plutôt que

my @keyword;
while($str =~ /([w]*)/g){
if(length($1) > 6 && length($1) < 11){
push @keyword,$1;
}
}

Ou est-ce simplement une question de goût ?

PS. Je sais que ça fait plus d'une question mais je suis de nature
curieuse

! :o)

Merci.



"Jean-Louis MOREL" a écrit dans le message de
news:buuckh$pdc$
Dans l'article <4AwQb.111834$,
zigzag15551

@hotmail.com a dit...

Expression relationnel & les accents (`´^¨)

Vous l'aurez compris je cherche une manière plus élégante pour
supprimer



les
caractères (`´^¨) d'une chaine de texte !

En fait, j'aimerais pouvoir les détecter dans l'expression relationnel
mais


sans les tester un à un !

### Voilà le script en question ! ###

[couic]


Utilisez l'opérateur de translitération et travaillez directement sur
les


listes. Par exemple :

#!/usr/bin/perl
print "Content-type: text/htmlnn<html><pre>n";
&check_keyword("Dîtes-vous que l'on peut tout faire en Perl : gérer des
formulaires, des commandes, des boutiques virtuelles, des paiements
sécurisés, des bases de données (Mysql, Oracle, Db2, etc) envoyer des
e-mails, écrire dans des fichiers, on en passe et des meilleurs !");
############################## - ??
sub check_keyword {
$_ = lc shift;
tr/àâäçèéêëìîïòôöùûü/aaaceeeiiiooouuu/;
my @keyword = grep {length($_)>6 and length($_)<11} split /W/;
print "$_n" foreach @keyword;
}
############################## - !!

print "</pre></html>n";

__END__

--
J-L.M.








Avatar
root
On Sat, 24 Jan 2004 15:25:39 -0500, ZigZag15551 wrote:

Selon vous laquelle de c'est deux options est la meilleur et pourquoi ?
(Rapidité d'execution, lisibilité ???)

### 1er ###
sub str2num {
$_ = shift;

s/[ABCabc]/2/g;
s/[DEFdef]/3/g;
s/[GHIghi]/4/g;
s/[JKLjkl]/5/g;
s/[MNOmno]/6/g;
s/[PRSprs]/7/g;
s/[TUVtuv]/8/g;
s/[WXYwxy]/9/g;

return $_;
}

### ou 2e ###

sub str2num {
$_ = shift;

tr/ABCabcDEFdefGHIghiJKLjklMNOmnoPRSprsTUVtuvWXYwxy/222222333333444444555555
666666777777888888999999/;

return $_;
}

###



use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;

sub str2num_s {
$_ = shift;
s/[ABCabc]/2/g;
s/[DEFdef]/3/g;
s/[GHIghi]/4/g;
s/[JKLjkl]/5/g;
s/[MNOmno]/6/g;
s/[PRSprs]/7/g;
s/[TUVtuv]/8/g;
s/[WXYwxy]/9/g;
return $_;
}

sub str2num_tr {
$_ = shift;
tr/ABCabcDEFdefGHIghiJKLjklMNOmnoPRSprsTUVtuvWXYwxy/222222333333444444555555666666777777888888999999/;
return $_;
}

my @alpha = ('a'..'z', 'A'..'Z');
my $str;
for( my $i=0; $i<256; $i++ ) {
$str.=$alpha[int(rand($#alpha))];
}

my $resultat = timethese(
20000,
{
"Substitutions" => "str2num_s("$str")",
"Transliteration" => "str2num_tr("$str")",
}
);

cmpthese( $resultat );
__END__

Benchmark: timing 20000 iterations of Substitutions, Transliteration...
Substitutions: 23 wallclock secs (22.42 usr + 0.02 sys = 22.44 CPU) @ 891.27/s (n 000)
Transliteration: 1 wallclock secs ( 0.88 usr + 0.00 sys = 0.88 CPU) @ 22727.27/s (n 000)
Rate Substitutions Transliteration
Substitutions 891/s -- -96%
Transliteration 22727/s 2450% --

Le tr/// semble infiniment plus performant dans ce cas que les s///

Et j'ai remarqué que vous m'avez corrigé ! Est t-il vraiment mieux d'utilisé
:

1. "shift" plutôt que "$_[0]" ?



C'est toi qui vois. Le `shift' entraine plutôt une notion de pile de
taille inconnu/variable, alors que le `$_[0]' entraine plutôt la notion
d'un tableau de taille fixé auquel on accede avec un indice...
Ça depend comment tu perçois ta liste d'arguments. Une liste dont tu
« consommes » les elements séquentiellement ? alors ce sera `shift'. Ou
bien un tableau avec des elements a des positions bien définis ? alors ce
sera `$_[]'.

2. "and" plutôt que "||" ?



Il y a une difference dans le fonctionnement entre le `or' et le `||', et
entre le `and' et le '&&'...
Précisemment je saurais pas l'expliquer :) mais voilà un exemple qui
doit montrer la difference :

sub foo {
$x = shift;
$y = shift;
print "x=$x y=$yn";
}

foo 1,0 || 2; # x=1 y=2
foo 1,(0 || 2); # x=1 y=2
foo 1,0 or 2; # x=1 y=0
foo(1,0) || 2; # x=1 y=0
__END__

C'est une histoire de precedence/priorité qui fait que tu peux te passer
de parenthèses quand tu fais un open/die en utilisant un `or' :

open(F,"...") or die "Erreurn";

que tu peux donc écrire :

open F, "..." or die "Erreurn";

Alors que si tu utilises un `||' il faudrait absolument mettre les
parenthèses...

3. my @keyword = grep {length($_)>6 and length($_)<11} split /W/;

plutôt que

my @keyword;
while($str =~ /([w]*)/g){
if(length($1) > 6 && length($1) < 11){
push @keyword,$1;
}
}



Je trouve la premiere notation (celle avec le grep) plus naturelle et
facile à lire/comprendre.

Dans ton cas, la fonction `grep()' implique directement la notion de
filtrage, donc en voyant un grep je sais que tu vas séparer les valeurs
d'une liste et les mettre dans @keyword. Alors que dans la deuxième
notation il faut que je lise le `while', puis le `if' et enfin je comprend
que tu mets la valeur dans la liste @keyword et que tu filtres donc ces
valeurs.

Pour moi, la premiere solution c'est vraiment de la programmation 100% en
Perl, alors que la seconde serait plutôt pensé en C et traduite en Perl
par exemple.

C'est comme pour les langues étrangère, tu peux parler anglais mais
penser en français, ou bien parler anglais mais aussi penser en anglais...

Ou est-ce simplement une question de goût ?



c'est surtout que « TIMTOWTDI » ;)

Avatar
Giss
ZigZag15551 wrote:

Encore une petite question !
Selon vous laquelle de c'est deux options est la meilleur et pourquoi ?
(Rapidité d'execution, lisibilité ???)

### 1er ###

s/[ABCabc]/2/g;
s/[DEFdef]/3/g;
s/[GHIghi]/4/g;
s/[JKLjkl]/5/g;
s/[MNOmno]/6/g;
s/[PRSprs]/7/g;
s/[TUVtuv]/8/g;
s/[WXYwxy]/9/g;

### ou 2e ###

tr/ABCabcDEFdefGHIghiJKLjklMNOmnoPRSprsTUVtuvWXYwxy/222222333333444444555555
666666777777888888999999/;


Si le deuxieme est plus performant (cf autre réponse), il est peut être
effectivement un poil moins lisible...

Heureusement, perl a prevu ce cas, et dans sa grande sagesse, il te
permet d'écrire :

tr/ABCabcDEFdefGHIghiJKLjklMNOmnoPRSprsTUVtuvWXYwxy/222222333333444444555555666666777777888888999999/;

sous la forme :

tr{ABCabcDEFdefGHIghiJKLjklMNOmnoPRSprsTUVtuvWXYwxy}
{222222333333444444555555666666777777888888999999};

ou encore :

tr{ABC abc DEF def GHI ghi JKL jkl MNO mno PRS prs TUV tuv WXY wxy}
{222 222 333 333 444 444 555 555 666 666 777 777 888 888 999 999};

*ATTENTION* : l'operateur tr/// ne supporte pas le modificateur x pour
perettre les caracteres espaces, les retour chariot etc. en plein milieu
des termes (comme s/// ou m// le font). Ici, les espaces sont
effectivement remplace... par des espaces. Donc cela est peut-etre un
poil plus couteux en temps machine. Mais personnelement comme c'est plus
lisible, je prefere.