[PERL] remplacer un mot dans un fichier

remplacer un mot dans un fichier [PERL] - Perl - Programmation

Marsh Posté le 23-10-2017 à 13:03:08    

Bonjour,
 
J'ai un fichier texte de plusieurs lignes qui contient à plusieurs endroits le mot contenu dans la variable $configname et je veux le remplacer par le contenu de la variable $replace.
Voila ce que j'ai écris :
 

Code :
  1. open(FILE_IN,$LOG);
  2. my @contenu = <FILE_IN>;
  3. close(FILE_IN);
  4. open(FILE_OUT,">$LOG2" );
  5. foreach my $ligne(@contenu)
  6. {
  7.  $ligne=~ s/$configname/$replace/ge;
  8.  print FILE_OUT "$ligne";
  9. }
  10. close (FILE_OUT);


 
Le problème c'est qu'il ne remplace que le premier, le deuxième et le dernier mot, mais pas tous les autres :( .
 
Quelqu'un à une idée du problème dans mon code ?
 
:jap:

Reply

Marsh Posté le 23-10-2017 à 13:03:08   

Reply

Marsh Posté le 23-10-2017 à 16:23:29    

Chez moi ça fonctionne... Comment sont définies les variables que tu utilises, notamment $configname? A quoi exactement ressemble ton fichier $LOG?

 

Ceci étant, à ma connaissance il vaut mieux utiliser la version de open() avec trois arguments et inutile de lire tout le fichier d'un coup si tu fais une boucle après. Perso je ferais comme ceci:

Code :
  1. #personnellement je trouve ces deux lignes indispensables, après le FATAL=>'all' on peut en discuter...
  2. use strict;
  3. use warnings FATAL=>'all';
  4.  
  5. #gestion d'erreur avec les fichiers!
  6. use autodie;
  7.  
  8. my $LOG="input";
  9. my $LOG2="output";
  10. my $configname="old";
  11. my $replace="new";
  12.  
  13. open(FILE_IN, '<', $LOG);
  14. open(FILE_OUT,'>', $LOG2);
  15.  
  16. while((my $ligne=<FILE_IN> )) #parenthèses supplémentaires pour indiquer
  17. #qu'on veut bien une assignation et non pas une comparaison avec faute de frappe (= à la place de ==)
  18. {
  19.    $ligne=~ s/$configname/$replace/geo; #o=once=le regex ne change pas ($configname et $replace),
  20. #pas indispensable mais peut-être utile (vitesse)
  21.    print FILE_OUT $ligne; #pas besoin de mettre des guillemets
  22. }
  23.  
  24. close(FILE_IN);
  25. close (FILE_OUT);


Selon le fichier et ce que tu veux remplacer il peut être nécessaire de modifier le regex pour ne considérer que des mots entiers (et pas remplacer $configname à l'intérieur d'un mot).

 

edit: +\n dans les commentaires


Message édité par rat de combat le 23-10-2017 à 16:24:24
Reply

Marsh Posté le 23-10-2017 à 16:45:40    

Et faire un truc homogène avec le reste, sans passer par des variables spéciales pour les file handlers
open(my $fh_in, '<', $log);
 
et utiliser les variables built-in dans les boucles:
foreach (@contenu) {
 s/$configname/$replace/ge;
 print $fh_out $_;
}
ou
foreach (<$fh_in> ) {
 s/$configname/$replace/ge;
 print $fh_out $_;
}
 
A+,


Message édité par gilou le 23-10-2017 à 16:47:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed