Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

regexpr et /m

11 réponses
Avatar
kurtz le pirate
bonsoir,

je lis tout un fichier d'un seul coup (undef $/) dans un scalaire qui
contient donc des retours à la ligne. si je veux faire des remplacements
sur plusieurs lignes (donc utiliser s/.../.../m), dois-je mettre des
'\n' dans l'expression ?

j'ai des comportements bizzares.

--
klp

10 réponses

1 2
Avatar
Dam
On 25 avr, 19:58, kurtz le pirate wrote:
bonsoir,

je lis tout un fichier d'un seul coup (undef $/) dans un scalaire qui
contient donc des retours à la ligne. si je veux faire des remplacements
sur plusieurs lignes (donc utiliser s/.../.../m), dois-je mettre des
'n' dans l'expression ?

j'ai des comportements bizzares.

--
klp


des r non?

Avatar
Dam
On 25 avr, 19:58, kurtz le pirate wrote:
bonsoir,

je lis tout un fichier d'un seul coup (undef $/) dans un scalaire qui
contient donc des retours à la ligne. si je veux faire des remplacements
sur plusieurs lignes (donc utiliser s/.../.../m), dois-je mettre des
'n' dans l'expression ?

j'ai des comportements bizzares.

--
klp


r ?

Avatar
Paul Gaborit
À (at) Wed, 25 Apr 2007 19:58:51 +0200,
kurtz le pirate écrivait (wrote):
bonsoir,

je lis tout un fichier d'un seul coup (undef $/) dans un scalaire qui
contient donc des retours à la ligne. si je veux faire des remplacements
sur plusieurs lignes (donc utiliser s/.../.../m), dois-je mettre des
'n' dans l'expression ?


Le modificateur /m agit sur la signification de "^" et de
"$". Normalement c'est début de chaîne et fin de chaîne. Avec /m,
c'est début et fin de ligne (dans la chaîne éventuellement
multi-lignes).

Le modificateur /s agit sur la signification de ".". Normalement, le
"." reconnaît n'importe quel caractère sauf un passage à la
ligne. Avec /s, le "." reconnaît aussi le passage à la ligne.

Ensuite, si vous souhaitez reconnaître explicitement un passage à la
ligne, vous pouvez utiliser "n".

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Vincent Lefevre
Dans l'article ,
Dam écrit:

On 25 avr, 19:58, kurtz le pirate wrote:
bonsoir,

je lis tout un fichier d'un seul coup (undef $/) dans un scalaire qui
contient donc des retours à la ligne. si je veux faire des remplacements
sur plusieurs lignes (donc utiliser s/.../.../m), dois-je mettre des
'n' dans l'expression ?



Que tu utilises le modifieur m ou non, tu dois mettre n (ou quelque
chose qui le remplace, comme s je suppose) dans l'expression pour un
pattern sur plusieurs lignes. En revanche, si tu utilises le modifieur
s, tu peux t'en dispenser si tu utilises "." (man perlre).

des r non?


Non.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Nicolas George
Paul Gaborit wrote in message :
"$". Normalement c'est début de chaîne et fin de chaîne.


Pour $, c'est fin de chaîne ou juste avant un n à la fin de la chaîne.
C'est traître, parfois.

Avatar
Paul Gaborit
À (at) 26 Apr 2007 11:41:31 GMT,
Nicolas George <nicolas$ écrivait (wrote):
Paul Gaborit wrote in message :
"$". Normalement c'est début de chaîne et fin de chaîne.


Pour $, c'est fin de chaîne ou juste avant un n à la fin de la chaîne.
C'est traître, parfois.


C'est vrai qu'il faut le préciser. C'est traitre quand on ne le sait
pas. Mais c'est très pratique pour éviter l'emploi de 'chomp'.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
kurtz_le_pirate
"Paul Gaborit" a écrit dans le message
de news:

À (at) Wed, 25 Apr 2007 19:58:51 +0200,
kurtz le pirate écrivait (wrote):
bonsoir,

je lis tout un fichier d'un seul coup (undef $/) dans un scalaire
qui
contient donc des retours à la ligne. si je veux faire des
remplacements
sur plusieurs lignes (donc utiliser s/.../.../m), dois-je mettre
des
'n' dans l'expression ?


Le modificateur /m agit sur la signification de "^" et de
"$". Normalement c'est début de chaîne et fin de chaîne. Avec /m,
c'est début et fin de ligne (dans la chaîne éventuellement
multi-lignes).

Le modificateur /s agit sur la signification de ".". Normalement, le
"." reconnaît n'importe quel caractère sauf un passage à la
ligne. Avec /s, le "." reconnaît aussi le passage à la ligne.

Ensuite, si vous souhaitez reconnaître explicitement un passage à la
ligne, vous pouvez utiliser "n".


hum... hum... toujours pas clair pour moi :((
en fait je n'ai pas besoin de reconnaitre explicitement le retour à la
ligne.
pour faire simple, j'ai des fichiers du genre :
...
[section1]
adresseIp=1.2.3.4
...
[section14]
adresseIp=1.2.3.4
...
...
...
[section5]
adresseIp.100.52.41
...
...

je veux changer : [section14]nadresseIp=1.2.3.4n
par : [section14]nadresseIp.13.14.15ntoto=5n

->
s/[section14]nadresseIp=1.2.3.4n/[section14]nadresseIp.13.14.15ntoto=5n/m

--
klp


Avatar
Jean-Baptiste Mazon
"kurtz_le_pirate" writes:
je veux changer : [section14]nadresseIp=1.2.3.4n
par : [section14]nadresseIp.13.14.15ntoto=5n

->
s/[section14]nadresseIp=1.2.3.4n/[section14]nadresseIp.13.14.15ntoto=5n/m


Sinon que les crochets de la partie "pattern" doivent être échappés
( [section14] ), ça marche chez moi (TM). Le modificateur `m' est
d'ailleurs superflu pour ladite substitution.

Avatar
kurtz le pirate
In article ,
Jean-Baptiste Mazon wrote:

"kurtz_le_pirate" writes:
je veux changer : [section14]nadresseIp=1.2.3.4n
par : [section14]nadresseIp.13.14.15ntoto=5n

->
s/[section14]nadresseIp=1.2.3.4n/[section14]nadresseIp.13.14.15ntoto > > 5n/m


Sinon que les crochets de la partie "pattern" doivent être échappés
( [section14] ), ça marche chez moi (TM). Le modificateur `m' est
d'ailleurs superflu pour ladite substitution.


oui, j'ai tappé un peu vite. il faut le [, mais pas le ].

sinon, ça prouve bien que je n'ai pas encore compris le /m :(


merci
--
klp


Avatar
Klaus
On Apr 25, 7:58 pm, kurtz le pirate wrote:
bonsoir,

je lis tout un fichier d'un seul coup (undef $/) dans un scalaire qui
contient donc des retours à la ligne. si je veux faire des remplacements
sur plusieurs lignes (donc utiliser s/.../.../m), dois-je mettre des
'n' dans l'expression ?


ça dépend, voir http://perl.enstimac.fr/DocFr/perlre.html

j'ai des comportements bizzares.


Merci de donner un exemple programme perl (court mais complet avec un
fichier DATA et la commande s/.../.../m) qui montre le comportement,
par exemple:

use strict;
use warnings;
$/ = undef;
my $multi_ligne = <DATA>;
print "Avant : ", unpack('H*', $multi_ligne), "n
n";
print "Opération: s/^B/Z/mnn";
$multi_ligne =~ s/^B/Z/m;
print "J'espère le résultat : 410a5a0a430an";
print "Voici le résultat obtenu: ", unpack('H*', $multi_ligne), "n";
__DATA__
A
B
C


--
Klaus

1 2