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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:
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é:
(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
On 12 Dec 2004 23:22:21 -0800
develop@tiscali.fr (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:
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é:
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:
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é: