OVH Cloud OVH Cloud

prob sur regexp

15 réponses
Avatar
Sébastien Cottalorda
Bonjour =E0 tous.
Dans le cadre d'une application manipulant un protocole r=E9seau, je
dois splitter une trame comme suit.
exemple :

bonjour, comment =E7a va?{ETX}XJe vais bien. Et toi ?{ETX}X{ACK}{NACK}

Je doit splitter comme ceci:
phrase1: bonjour, comment =E7a va?{ETX}X
phrase2: Je vais bien. Et toi ?{ETX}X
phrase3: {ACK}
phrase{NACK}

j'ai fait comme ceci, mais cela ne marche pas.


use constant ETX =3D> chr( hex('03'));
use constant ACK =3D> chr( hex('06'));
use constant NACK =3D> chr( hex('15'));
my $endcar =3D ACK.'|'.ETX.'.|'.NACK;
my $phrase =3D "bonjour, comment =E7a va?".ETX."XJe vais bien. Et
toi ?".ETX."X".ACK.NACK;
while ($phrase =3D~ s/([^($endcar(]*($endcar))//){
print "buf=3D$1\n";
}
print "r=E9sidu =3D $phrase\n";


mais j'obtiens:
buf=3DX
buf=3DX
buf=3D Et toi ?
buf=3D
r=E9sidu =3D bonjour, comment =E7a va?Je vais bien.

Je ne m'en sort pas.
Je doit splitter ma ligne en fonction:
* soit des ACK,
* soit des NACK,
* soit des ETX suivi d'un caract=E8re quelconque.

Je n'y arrive vraiment pas. C'est le double ETX+caract=E8re qui me
plombe tout.
Car si j'avais uniquement ACK, NACK et ETX, cela fonctionnerait
parfaitement

Merci de votre aide.
Sebastien

5 réponses

1 2
Avatar
Sébastien Cottalorda
On 24 nov, 10:37, Jogo wrote:
Sur fr.comp.lang.perl, Olivier Miakinen disait :

> while ($phrase =~ s/$beginstring(.*?$endstring)//) {
>     print "buf=$1n";
> }

  Je ne comprend pas l'utilisation de la substitution ici. Pourquoi ne
pas faire :

while ($phrase =~ /$beginstring(.*?$endstring)/g) {
    print "buf=$1n";

}




Parce que le
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";
}
print "residu=$phrasen";

vide la variable $phrase au fur et à mesure et mettant tous les
éléments (parsé selon $beginstring et$endstring) tour à tour dans
$buf.
A la fin de la boucle --> $phrase doit être vide.
Alors qu'avec
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";
}
print "residu=$phrasen";
a la fin, $residu = $phrase et cela seulement si tu trouves un moyen
de sortir de la boucle sans fin car si $phrase contient une séquence
au bon format, tu tournes sans arrêt.

--
 Très honnetement, je crois que tant qu'on mettra de l'affectif dans
 la gestion des forums et plus généralement dans la façon d'abord er
 ce média, on ne pourra rien faire de bien.
 -- Hervé Petit dans fufe --


Avatar
Sébastien Cottalorda
On 26 nov, 19:17, Sébastien Cottalorda
wrote:
On 24 nov, 10:37, Jogo wrote:

> Sur fr.comp.lang.perl, Olivier Miakinen disait :

> > while ($phrase =~ s/$beginstring(.*?$endstring)//) {
> >     print "buf=$1n";
> > }

>   Je ne comprend pas l'utilisation de la substitution ici. Pourquoi n e
> pas faire :

> while ($phrase =~ /$beginstring(.*?$endstring)/g) {
>     print "buf=$1n";

> }



Parce que le
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
    print "buf=$1n";}
print "residu=$phrasen";

vide la variable $phrase au fur et à mesure et mettant tous les
éléments (parsé selon $beginstring et$endstring) tour à tour dans
$buf.
A la fin de la boucle --> $phrase doit être vide.
Alors qu'avec
while ($phrase =~ /$beginstring(.*?$endstring)/) {
    print "buf=$1n";
}
print "residu=$phrasen";
a la fin, $residu = $phrase et cela seulement si tu trouves un moyen
de sortir de la boucle sans fin car si $phrase contient une séquence
au bon format, tu tournes sans arrêt.

> --
>  Très honnetement, je crois que tant qu'on mettra de l'affectif dan s
>  la gestion des forums et plus généralement dans la façon d'abo rder
>  ce média, on ne pourra rien faire de bien.
>  -- Hervé Petit dans fufe --


Avatar
Jogo
Sur fr.comp.lang.perl, Sébastien Cottalorda disait :

a la fin, $residu = $phrase et cela seulement si tu trouves un moyen
de sortir de la boucle sans fin car si $phrase contient une séquence
au bon format, tu tournes sans arrêt.



Avec le modificateur g, il n'y aura pas de boucle sans fin.


--
L'anti-terrorisme reproche centralement à ceux qu'il vise
des intentions, des idées, et reproche des infractions seulement
en second lieu comme matérialisation de ces idées et intentions.
-- Julien Coupat --
Avatar
Jogo
Sur fr.comp.lang.perl, Marc Espie disait :

Deja, ca ne va pas afficher la meme chose...



À part pour le résidu, si. Teste pour t'en convaincre.



Ben non.



Si, si, teste. Ça donne pour la version d'Olivier (je fais un
copier-coller donc les caractères de contrôles sonc môches) :

buf=bonjour, comment ça va?X
buf=Je vais bien. Et toi ?X
buf=
buf=
résidu =

Pour ma version, ça donne :

buf=bonjour, comment ça va?X
buf=Je vais bien. Et toi ?X
buf=
buf=
résidu = bonjour, comment ça va?XJe vais bien. Et toi ?X


Dans un cas tu affiches le seul element substitue, dans
l'autre cas, tu affiches le 1er de n elements.



Je ne comprend pas du tout cette phrase.


C'est pas du tout pareil.

Alors, si c'est ca que tu entends par "a part pour le residu".



Quelles autres différences vois-tu ?


--
Nous courrons droit vers de graves collisions de post à charge
nucléaires... On va déraper dans les foutous.
-- Thierry B. dans fufe --
Avatar
Stephane CHAZELAS
2009-11-26, 10:20(-08), Sébastien Cottalorda:
[...]
On 24 nov, 10:37, Jogo wrote:




[...]
>   Je ne comprend pas l'utilisation de la substitution ici. Pourquoi ne
> pas faire :

> while ($phrase =~ /$beginstring(.*?$endstring)/g) {
>     print "buf=$1n";




[...]
Alors qu'avec
while ($phrase =~ /$beginstring(.*?$endstring)/) {
    print "buf=$1n";
}
print "residu=$phrasen";
a la fin, $residu = $phrase et cela seulement si tu trouves un moyen
de sortir de la boucle sans fin car si $phrase contient une séquence
au bon format, tu tournes sans arrêt.


[...]

Où est passé le "g" entre les deux?

while ('xxx' = /x/g)

est un moyen de looper sur les "x" de "xxx".

Comme

for $i ('xxx' = /x/g)

--
Stéphane
1 2