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

transformation d'une chaine de caractères

1 réponse
Avatar
develop
Bonjour,

J'aimerai remplcare une chaine de caractère dans un fichier par une
autre. Pour cela, j'utilise les expressions régulières mais ça ne
marche pas et je ne comprends vraiment pas pourquoi.
Voici un exemple de mon code

if( open(FIC,"+<fichier_test.pl") ){
while (<WEB_CONF>) {

if (($p) =~ /^\s*BLABLA\s*=\s*([0-9]{1})/) {
print FIC ($p)=~ s/[0-9]{1}/3/; }

}
}
close(WEB_CONF);

Appremment il trouve bien la ligne en question mais après il ne
remplace pas le chiffre

Merci pour votre aide

1 réponse

Avatar
Jérémy JUST
On 12 Dec 2004 23:22:21 -0800
(stef) wrote:

if( open(FIC,"+<fichier_test.pl") ){


Ici, tu définis un filehandle qui s'appelle FIC, ouvert en mode
modification...

while (<WEB_CONF>) {


... et ici, tu en lis un qui s'appelle WEB_CONF. Est-ce bien ce que tu
veux?


if (($p) =~ /^s*BLABLAs*=s*([0-9]{1})/) {
^^^^

Les parenthèses sont inutiles, et $p n'est pas définie.
Le « {1} » ne sert pas à grand chose (une répétition une fois, c'est
comme pas de répétition).


print FIC ($p)=~ s/[0-9]{1}/3/; }


Que veux-tu faire?
Ta première regexp renvoie « vrai » si la chaîne $p correspond au
motif. Sauf que $p ne semble pas être définie, et est en tous cas
constante dans ta boucle while.

Ensuite, dans ton print, tu remplaces un chiffre par « 3 », mais tu ne
fais rien de $p ensuite. Par contre, tu affiches la valeur de retour de
ta regexp, qui vaut 0 ou 1 (nombre de substitutions effectuées).


Utilises *toujours* « use strict » et « use warnings » dans tes
programmes.
Et je te conseille d'aller lire la perldoc perlretut (introduction aux
regexps) et une petite introduction à Perl (une excellente existe chez
O'Reilly, mais peut-être pourras-tu en trouver une en ligne).


Appremment il trouve bien la ligne en question mais après il ne
remplace pas le chiffre


Est-ce que tu ne voudrait pas plutôt un truc comme ça:

$ perl -pe 's/^(s*BLABLAs*=s*)d/$1.3/e' fichier_test.pl

C'est un programme en une seule ligne, que je passe à Perl entre
guillemets, avec l'option -e.
L'option -p fait que Perl va boucler sur toutes les lignes du fichier
passé en paramètre, stocker chacune des lignes dans $_, exécuter mon
programme, puis exécuter « print $_ ».
Ma regexp s'applique par défaut à $_ (donc chacune des lignes du
fichier). Elle reconnaît le motif que tu cherchais (j'ai remplacé [0-9]
par d pour une meilleur lisibilité; c'est synonyme). Dans le second
terme de la regexp, je reprends ce qui figurait dans la première
parenthèse avec $1 (les parenthèses permettent de mettre en mémoire ce
qu'elles ont reconnu), et je lui concatène le caractère 3.
L'option e de la regexp fait que le second membre est exécuté comme du
code perl. C'est pour que le point (.) soit pris comme une
concaténation. Une écriture plus simple aurait été:

$ perl -pe 's/^(s*BLABLAs*=s*)d/$1 3/' fichier_test.pl

(sans l'option de regexp), mais elle ajoute une espace en trop devant
le 3 (je n'ai pas le droit d'écrire $13).


Ça te va?

--
Jérémy JUST