Dans le cadre d'une application manipulant un protocole réseau, je
dois splitter une trame comme suit.
exemple :
bonjour, comment ça va?{ETX}XJe vais bien. Et toi ?{ETX}X{ACK}{NACK}
Je doit splitter comme ceci:
phrase1: bonjour, comment ça 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 => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
my $endcar = ACK.'|'.ETX.'.|'.NACK;
my $phrase = "bonjour, comment ça va?".ETX."XJe vais bien. Et
toi ?".ETX."X".ACK.NACK;
while ($phrase =~ s/([^($endcar(]*($endcar))//){
print "buf=$1n";
}
print "résidu = $phrasen";
mais j'obtiens:
buf=X
buf=X
buf= Et toi ?
buf > résidu = bonjour, comment ça va?Je vais bien.
Je doit splitter ma ligne en fonction:
* soit des ACK,
* soit des NACK,
* soit des ETX suivi d'un caractère quelconque.
Je n'y arrive vraiment pas. [...]
Dans le cadre d'une application manipulant un protocole réseau, je
dois splitter une trame comme suit.
exemple :
bonjour, comment ça va?{ETX}XJe vais bien. Et toi ?{ETX}X{ACK}{NACK}
Je doit splitter comme ceci:
phrase1: bonjour, comment ça 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 => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
my $endcar = ACK.'|'.ETX.'.|'.NACK;
my $phrase = "bonjour, comment ça va?".ETX."XJe vais bien. Et
toi ?".ETX."X".ACK.NACK;
while ($phrase =~ s/([^($endcar(]*($endcar))//){
print "buf=$1n";
}
print "résidu = $phrasen";
mais j'obtiens:
buf=X
buf=X
buf= Et toi ?
buf > résidu = bonjour, comment ça va?Je vais bien.
Je doit splitter ma ligne en fonction:
* soit des ACK,
* soit des NACK,
* soit des ETX suivi d'un caractère quelconque.
Je n'y arrive vraiment pas. [...]
Dans le cadre d'une application manipulant un protocole réseau, je
dois splitter une trame comme suit.
exemple :
bonjour, comment ça va?{ETX}XJe vais bien. Et toi ?{ETX}X{ACK}{NACK}
Je doit splitter comme ceci:
phrase1: bonjour, comment ça 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 => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
my $endcar = ACK.'|'.ETX.'.|'.NACK;
my $phrase = "bonjour, comment ça va?".ETX."XJe vais bien. Et
toi ?".ETX."X".ACK.NACK;
while ($phrase =~ s/([^($endcar(]*($endcar))//){
print "buf=$1n";
}
print "résidu = $phrasen";
mais j'obtiens:
buf=X
buf=X
buf= Et toi ?
buf > résidu = bonjour, comment ça va?Je vais bien.
Je doit splitter ma ligne en fonction:
* soit des ACK,
* soit des NACK,
* soit des ETX suivi d'un caractère quelconque.
Je n'y arrive vraiment pas. [...]
my $noendcar = '[^' . ACK . ETX . NACK . ']';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$noendcar*$endstring//) {
print "buf=$&n";
}
À tout hasard, je te signale l'existence du forum fr.comp.lang.regexp
qui pourrait convenir aussi, à condition de ne pas avoir trop de code
perl en plus des regexp.
Cordialement,
--
Olivier Miakinen
my $noendcar = '[^' . ACK . ETX . NACK . ']';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$noendcar*$endstring//) {
print "buf=$&n";
}
À tout hasard, je te signale l'existence du forum fr.comp.lang.regexp
qui pourrait convenir aussi, à condition de ne pas avoir trop de code
perl en plus des regexp.
Cordialement,
--
Olivier Miakinen
my $noendcar = '[^' . ACK . ETX . NACK . ']';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$noendcar*$endstring//) {
print "buf=$&n";
}
À tout hasard, je te signale l'existence du forum fr.comp.lang.regexp
qui pourrait convenir aussi, à condition de ne pas avoir trop de code
perl en plus des regexp.
Cordialement,
--
Olivier Miakinen
my $noendcar = '[^' . ACK . ETX . NACK . ']';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$noendcar*$endstring//) {
print "buf=$&n";
}
J'ai essayé ceci:
my $endcar = ACK . ETX . NACK;
while ($phrase =~ s/([[:^cntrl:]]*($endcar))//){
Ca a l'air de marcher impec,
mais j'ai un autre soucis, c'est que le
problème est juste un tout petit peu plus compliqué.
Une vrai trame (in my real life) est comme ceci :
{STX}bonjour, comment ça va?{ETX}X{STX}Je vais bien. Et toi ?{ETX}X
{ACK}{NACK}
(nota: en fait le X qui fait suite à chaque ETX est un checksum
calculé : il est différent à chaque fois)
Là, en appliquant le while j'obtiens:
bonjour, comment ça va?{ETX}X
Je vais bien. Et toi ?{ETX}X
{ACK}
{NACK}
mais j'arrive à un résidu égal à : {STX}{STX}
my $noendcar = '[^' . ACK . ETX . NACK . ']';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$noendcar*$endstring//) {
print "buf=$&n";
}
J'ai essayé ceci:
my $endcar = ACK . ETX . NACK;
while ($phrase =~ s/([[:^cntrl:]]*($endcar))//){
Ca a l'air de marcher impec,
mais j'ai un autre soucis, c'est que le
problème est juste un tout petit peu plus compliqué.
Une vrai trame (in my real life) est comme ceci :
{STX}bonjour, comment ça va?{ETX}X{STX}Je vais bien. Et toi ?{ETX}X
{ACK}{NACK}
(nota: en fait le X qui fait suite à chaque ETX est un checksum
calculé : il est différent à chaque fois)
Là, en appliquant le while j'obtiens:
bonjour, comment ça va?{ETX}X
Je vais bien. Et toi ?{ETX}X
{ACK}
{NACK}
mais j'arrive à un résidu égal à : {STX}{STX}
my $noendcar = '[^' . ACK . ETX . NACK . ']';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$noendcar*$endstring//) {
print "buf=$&n";
}
J'ai essayé ceci:
my $endcar = ACK . ETX . NACK;
while ($phrase =~ s/([[:^cntrl:]]*($endcar))//){
Ca a l'air de marcher impec,
mais j'ai un autre soucis, c'est que le
problème est juste un tout petit peu plus compliqué.
Une vrai trame (in my real life) est comme ceci :
{STX}bonjour, comment ça va?{ETX}X{STX}Je vais bien. Et toi ?{ETX}X
{ACK}{NACK}
(nota: en fait le X qui fait suite à chaque ETX est un checksum
calculé : il est différent à chaque fois)
Là, en appliquant le while j'obtiens:
bonjour, comment ça va?{ETX}X
Je vais bien. Et toi ?{ETX}X
{ACK}
{NACK}
mais j'arrive à un résidu égal à : {STX}{STX}
bonjour, comment ça va?{ETX}XJe vais bien. Et toi ?{ETX}X{ACK}{NACK}
Je doit splitter comme ceci:
phrase1: bonjour, comment ça va?{ETX}X
phrase2: Je vais bien. Et toi ?{ETX}X
phrase3: {ACK}
phrase{NACK}
bonjour, comment ça va?{ETX}XJe vais bien. Et toi ?{ETX}X{ACK}{NACK}
Je doit splitter comme ceci:
phrase1: bonjour, comment ça va?{ETX}X
phrase2: Je vais bien. Et toi ?{ETX}X
phrase3: {ACK}
phrase{NACK}
bonjour, comment ça va?{ETX}XJe vais bien. Et toi ?{ETX}X{ACK}{NACK}
Je doit splitter comme ceci:
phrase1: bonjour, comment ça va?{ETX}X
phrase2: Je vais bien. Et toi ?{ETX}X
phrase3: {ACK}
phrase{NACK}
Le 18/11/2009 17:50, Sébastien Cottalorda m'a répondu :
>> my $noendcar = '[^' . ACK . ETX . NACK . ']';
>> my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
>> while ($phrase =~ s/$noendcar*$endstring//) {
>> print "buf=$&n";
>> }
> J'ai essayé ceci:
> my $endcar = ACK . ETX . NACK;
> while ($phrase =~ s/([[:^cntrl:]]*($endcar))//){
Euh... tu es sûr d'avoir vraiment essayé ça ?
> Ca a l'air de marcher impec,
Avec $endcar qui est juste la concaténation des trois caractères de
contrôle ???
> mais j'ai un autre soucis, c'est que le
> problème est juste un tout petit peu plus compliqué.
> Une vrai trame (in my real life) est comme ceci :
> {STX}bonjour, comment ça va?{ETX}X{STX}Je vais bien. Et toi ?{ETX}X
> {ACK}{NACK}
> (nota: en fait le X qui fait suite à chaque ETX est un checksum
> calculé : il est différent à chaque fois)
Oui. Et mon code ne te plaisait pas ? Peut-être n'as-tu pas vu que
j'avais aussi remplacé $1 par $& ?
> Là, en appliquant le while j'obtiens:
> bonjour, comment ça va?{ETX}X
> Je vais bien. Et toi ?{ETX}X
> {ACK}
> {NACK}
> mais j'arrive à un résidu égal à : {STX}{STX}
Avec ma proposition initiale, tu devrais obtenir :
{STX}bonjour, comment ça va?{ETX}X
{STX}Je vais bien. Et toi ?{ETX}X
{ACK}
{NACK}
et un résidu vide.
Si en outre tu veux supprimer les {STX}, alors tu peux essayer ceci :
use constant STX => chr( hex('02'));
use constant ETX => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
my $phrase = STX . "bonjour, comment ça va?" . ETX . "X"
. STX . "Je vais bien. Et toi ?" . ETX . "X"
. ACK . NACK;
my $beginstring = STX . '?';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";}
print "résidu = $phrasen";
Tu devrais obtenir :
buf=bonjour, comment ça va?{ETX}X
buf=Je vais bien. Et toi ?{ETX}X
buf={ACK}
buf={NACK}
résidu =
Enfin, si tu veux aussi supprimer les {ETX}X, {ACK} et {NACK], il suffit
de déplacer une parenthèse :
s/$beginstring(.*?)$endstring//
Cordialement,
--
Olivier Miakinen
Le 18/11/2009 17:50, Sébastien Cottalorda m'a répondu :
>> my $noendcar = '[^' . ACK . ETX . NACK . ']';
>> my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
>> while ($phrase =~ s/$noendcar*$endstring//) {
>> print "buf=$&n";
>> }
> J'ai essayé ceci:
> my $endcar = ACK . ETX . NACK;
> while ($phrase =~ s/([[:^cntrl:]]*($endcar))//){
Euh... tu es sûr d'avoir vraiment essayé ça ?
> Ca a l'air de marcher impec,
Avec $endcar qui est juste la concaténation des trois caractères de
contrôle ???
> mais j'ai un autre soucis, c'est que le
> problème est juste un tout petit peu plus compliqué.
> Une vrai trame (in my real life) est comme ceci :
> {STX}bonjour, comment ça va?{ETX}X{STX}Je vais bien. Et toi ?{ETX}X
> {ACK}{NACK}
> (nota: en fait le X qui fait suite à chaque ETX est un checksum
> calculé : il est différent à chaque fois)
Oui. Et mon code ne te plaisait pas ? Peut-être n'as-tu pas vu que
j'avais aussi remplacé $1 par $& ?
> Là, en appliquant le while j'obtiens:
> bonjour, comment ça va?{ETX}X
> Je vais bien. Et toi ?{ETX}X
> {ACK}
> {NACK}
> mais j'arrive à un résidu égal à : {STX}{STX}
Avec ma proposition initiale, tu devrais obtenir :
{STX}bonjour, comment ça va?{ETX}X
{STX}Je vais bien. Et toi ?{ETX}X
{ACK}
{NACK}
et un résidu vide.
Si en outre tu veux supprimer les {STX}, alors tu peux essayer ceci :
use constant STX => chr( hex('02'));
use constant ETX => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
my $phrase = STX . "bonjour, comment ça va?" . ETX . "X"
. STX . "Je vais bien. Et toi ?" . ETX . "X"
. ACK . NACK;
my $beginstring = STX . '?';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";}
print "résidu = $phrasen";
Tu devrais obtenir :
buf=bonjour, comment ça va?{ETX}X
buf=Je vais bien. Et toi ?{ETX}X
buf={ACK}
buf={NACK}
résidu =
Enfin, si tu veux aussi supprimer les {ETX}X, {ACK} et {NACK], il suffit
de déplacer une parenthèse :
s/$beginstring(.*?)$endstring//
Cordialement,
--
Olivier Miakinen
Le 18/11/2009 17:50, Sébastien Cottalorda m'a répondu :
>> my $noendcar = '[^' . ACK . ETX . NACK . ']';
>> my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
>> while ($phrase =~ s/$noendcar*$endstring//) {
>> print "buf=$&n";
>> }
> J'ai essayé ceci:
> my $endcar = ACK . ETX . NACK;
> while ($phrase =~ s/([[:^cntrl:]]*($endcar))//){
Euh... tu es sûr d'avoir vraiment essayé ça ?
> Ca a l'air de marcher impec,
Avec $endcar qui est juste la concaténation des trois caractères de
contrôle ???
> mais j'ai un autre soucis, c'est que le
> problème est juste un tout petit peu plus compliqué.
> Une vrai trame (in my real life) est comme ceci :
> {STX}bonjour, comment ça va?{ETX}X{STX}Je vais bien. Et toi ?{ETX}X
> {ACK}{NACK}
> (nota: en fait le X qui fait suite à chaque ETX est un checksum
> calculé : il est différent à chaque fois)
Oui. Et mon code ne te plaisait pas ? Peut-être n'as-tu pas vu que
j'avais aussi remplacé $1 par $& ?
> Là, en appliquant le while j'obtiens:
> bonjour, comment ça va?{ETX}X
> Je vais bien. Et toi ?{ETX}X
> {ACK}
> {NACK}
> mais j'arrive à un résidu égal à : {STX}{STX}
Avec ma proposition initiale, tu devrais obtenir :
{STX}bonjour, comment ça va?{ETX}X
{STX}Je vais bien. Et toi ?{ETX}X
{ACK}
{NACK}
et un résidu vide.
Si en outre tu veux supprimer les {STX}, alors tu peux essayer ceci :
use constant STX => chr( hex('02'));
use constant ETX => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
my $phrase = STX . "bonjour, comment ça va?" . ETX . "X"
. STX . "Je vais bien. Et toi ?" . ETX . "X"
. ACK . NACK;
my $beginstring = STX . '?';
my $endstring = '(' . ACK . '|' . ETX . '.|' . NACK . ')';
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";}
print "résidu = $phrasen";
Tu devrais obtenir :
buf=bonjour, comment ça va?{ETX}X
buf=Je vais bien. Et toi ?{ETX}X
buf={ACK}
buf={NACK}
résidu =
Enfin, si tu veux aussi supprimer les {ETX}X, {ACK} et {NACK], il suffit
de déplacer une parenthèse :
s/$beginstring(.*?)$endstring//
Cordialement,
--
Olivier Miakinen
use constant ETX => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
use constant ETX => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
use constant ETX => chr( hex('03'));
use constant ACK => chr( hex('06'));
use constant NACK => chr( hex('15'));
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";
}
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";
}
while ($phrase =~ s/$beginstring(.*?$endstring)//) {
print "buf=$1n";
}
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";
}
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";
}
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";
}
>>> 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";
}
Deja, ca ne va pas afficher la meme chose...
>>> 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";
}
Deja, ca ne va pas afficher la meme chose...
>>> 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";
}
Deja, ca ne va pas afficher la meme chose...
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";
}
Deja, ca ne va pas afficher la meme chose...
À part pour le résidu, si. Teste pour t'en convaincre.
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";
}
Deja, ca ne va pas afficher la meme chose...
À part pour le résidu, si. Teste pour t'en convaincre.
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";
}
Deja, ca ne va pas afficher la meme chose...
À part pour le résidu, si. Teste pour t'en convaincre.