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! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- 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! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- 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! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- 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