remplacement récursif sur des blocs de codes ciblés - Perl - Programmation
Marsh Posté le 24-11-2011 à 09:51:16
Pour l'instant, grâce au topic  
http://forum.hardware.fr/hfr/Progr [...] 7576_1.htm 
j'ai trouvé la solution ci dessous. Dites moi ce que vous en pensez. 
 
my $file =""; 
my @data = ("nom_1" ; "nom_2" ; "nom_3" ; "nom_4" ; "nom_5" ; "nom_6" ) 
  
 
 
 for( $i=1; $i<8; $i++ ) 
 { 
 	for( $i=1; $i<9; $i++ ) 
 	{ 
   $msg = "0$i"; 
   $file = "A0".$i."B".$j.".ext" 
   print "$file"; 
   open IN, $file or die $!; 
   while ($intext = <IN> ) { 
   foreach $valeur (@data){ 
   	if $intext = ~ /$valeur/){ 
     $v=~ s/VARIABLE = "1";/VARIABLE = "0";   
   	} 
   	} 
   } 
 	} 
 }
Marsh Posté le 24-11-2011 à 09:57:11
Ensuite, je souhaite exécuter ces mêmes modifs sur les fichiers  
A01aB1.ext à A08aB8.ext et A01bB1.ext à A01B8.ext 
 
J'ai changé un peu le code :  
 for( $i=1; $i<8; $i++ ) 
 { 
 	for( $i=1; $i<9; $i++ ) 
 	{ 
   $file = "A0".$i."B".$j.".ext" 
   print "$file"; 
   open IN, $file or die $!; 
   while ($intext = <IN> ) { 
   foreach $valeur (@data){ 
   	if $intext = ~ /$valeur/){ 
     $v=~ s/VARIABLE = "1";/VARIABLE = "0";   
   	} 
   	} 
   } 
 	} 
 }
Marsh Posté le 24-11-2011 à 11:11:29
Le code modifié est :  
    #!/usr/bin/perl 
      
    use strict; 
    use warnings; 
     
    my $file =""; 
    my $j = 0 ; 
    my $intext = ""; 
    my $intext2 = ""; 
    my $valeur = ""; 
    my $v = ""; 
    my @data = ("nom_3" , "nom_13" , "nom_20" , "nom_19" , "nom_25" , "nom_35" ); 
    for ($i=2; $i<9; $i++) 
        for ($j=2; $j<9; $j++) 
        { 
            $file = "A0".$i."B0"$j.".ext"; 
            print "$file \n"; 
            open IN, $file or die $!; 
            while ($intext = <IN> ) { 
            foreach $valeur (@data) 
            { 
                if ($intext =~ /$valeur/) 
                    { 
                    print  "valeur ".$valeur." trouvee\n"; 
                    if ($intext =~ /"VARIABLE"/){ 
                    print  "valeur ".$intext2." trouvee\n"; 
                    $intext2=~ s/1/0/; 
                    } 
                } 
             } 
             } 
        } 
 
 
Quand je l'éxecute, il ouvre les fichiers mais ne modifie pas les valeurs.  
 
HELP
Marsh Posté le 24-11-2011 à 12:04:30
| Citation : Quand je l'éxecute, il ouvre les fichiers mais ne modifie pas les valeurs.   | 
C'est normal ça, il fait cela pour la valeur qu'il lit (il a copié la ligne lue dans la variable $_ et c'est la dessus qu'il opère), pas pour celle du fichier. 
Bon, je vais regarder cela. 
Il y a un truc pas clair: 
le variable a changer dans un bloc approprié, elle s'appelle comment? VARIABLE? 
A+,
Marsh Posté le 24-11-2011 à 12:40:30
Bon, j'ai rien testé, donc le code est SGDG, mais ça pourrait ressembler à ceci: 
 
| Code : 
 | 
 
 
foreach my $i (2..9) ==> fait varier automatiquement i de 2 a 9 dans la boucle 
my $file = "A0${i}B0${j}.ext"; ==> construit le nom de fichier d'un coup (${i] c'est $i, mais sans les accolades, ce serait pris pour $iB0 
if (-f $file) ==> on teste l'existence du fichier 
tie @farray, 'Tie::File', $file ==> lie le fichier a un array, les modifications de l'array sont répercutées sur le fichier 
untie @farray;  ==> opération inverse, a effectuer lorsque les manipulations du fichier sont achevées 
foreach (@farray)  ==> On traite l'array, donc le fichier, ligne à ligne 
| 	if (/nom_\d+/) {  Marsh Posté le 24-11-2011 à 12:53:13 Ici j'ai de la chance, la variable i est en fait une des nombreuses variables du bloc.   Marsh Posté le 24-11-2011 à 12:56:24 D'ailleurs les noms des blocs sont   Marsh Posté le 24-11-2011 à 14:21:07 
 Il faut tous les noms de blocs, pas seulement ceux que tu veux traiter (histoire de pas traiter ceux pas concernés par la substitution alors).  
   --------------- There's more than what can be linked! -- Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻ Marsh Posté le 24-11-2011 à 14:43:55 Notes que si tous tes blocs sont comme:  
   
   Message édité par gilou le 24-11-2011 à 14:44:39 --------------- There's more than what can be linked! -- Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻ Marsh Posté le 24-11-2011 à 15:09:18 Salut.   Marsh Posté le 24-11-2011 à 15:20:26 >> Comme ca, si on est différent de la ligne recherchée, ca n'applique pas les modifs.   Message édité par gilou le 24-11-2011 à 15:22:47 --------------- There's more than what can be linked! -- Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻ Marsh Posté le 24-11-2011 à 22:59:45 D'ailleurs, ca a marché avec un fichier qui avait des {} dans le header.   Message édité par yozyoz21 le 24-11-2011 à 23:07:39 Sujets relatifs:
 | 
Marsh Posté le 24-11-2011 à 08:58:13
Bonjour.
J'ai un répertoire avec 800 fichiers.
Dont certains sont nommés A01B1.ext à A08B8.ext, sachant qu'on a tous ces fichiers de A01 à A10.
Tous ces fichiers ont le même squelette de blocs, les mêmes noms de blocs (il y a 50 blocs).
nom_1
{
code1
vaviable_i ="1";
}
....
nom_n
{
code_n
vaviable_i ="1";
}
Je dois changer pour la liste {nom_3, nom_9, ...nom_i..., nom_40} la valeur de la variable à 0;
J'ai vu des solutions pour une partie du problème dans http://forum.hardware.fr/message.p [...] catgroup=0
Mais, je ne sais pas appliqiuer la modification uniquement à la liste {nom_3, nom_9, ...nom_i..., nom_40} qui peut être variable.
Auriez vous des solutions.
D'avance merci.
Message édité par yozyoz21 le 24-11-2011 à 09:20:01