PERL pb tampon ? ecriture dans fichier

Fermé
nono - 13 sept. 2011 à 11:56
Bonjour,

j'ecris un script en perl, et j'aimerai pouvoir modifier des lignes dans un fichier.J'enregistre le debut du fichier dans un tableau @debut_fichier, et la fin avec @fin_fichier. Mon script commence à ecrire @debut_fichier, puis me demande de taper ma nouvelle, $n, ligne, puis écris la fin du fichier.

Lorsque le script réecrit mon fichier, à la fin, il m'ajoute des élements de manière aleatoire, ce qui fait que mon fichier n'est plus "lisible", c'est a dire qu'il ne correspond pas à ce que je voudrais qu'il soit. Alors je me demande si c'est pas un probleme de tampon ou quelque chose dans le genre...

Voici mon script :


#!/usr/bin/perl
use warnings;
use strict;

#### Modifier la ligne $nb_ligne du fichier ####

my $a=0;
my $fichier;
my $nb_ligne;
my $prompt;
my $nb_ligne_modif = 0;
my @array;
my $nb_modif = 0;
my $fin;

sub ask {
print $_[0] . " : ";
chomp ($prompt = <STDIN>);
}


sub nouvelle_donnee {
my $reponse;
$a = $_[0];
ask "Nom" if ( $a==0 );
ask "Addresse" if ( $a==1 );
ask "Tel" if ( $a==2 );
ask "Mail" if ( $a==3 ) ;
$reponse = "$prompt\t";
return $reponse;
}

sub modif_ligne {
my $buff;
my $num_fin_ligne;
my $nom;
my @ligne_fich;
my @tot_fichier;
my @debut_fichier;
my @fin_fichier;
my $x = 0;

$a = 0;

print "La ligne à modifier est $_[1]\n";

seek ( FH, 0,0 );
while ( $buff= <FH> ) {
push @tot_fichier, $buff;
}

foreach ( @tot_fichier ) {
push (@debut_fichier, $_) if ( $a < $_[1] );
push (@fin_fichier, $_ ) if ( $a > $_[1] );
$a++;
}
undef ( @tot_fichier );

$fin = $a;
$a = 0;
seek ( FH, 0, 0 );

# Ecrire ce qu'il y avait avant dans le fichier
foreach ( @debut_fichier ) {
print FH $_;
$a++;
}
# Ecrire la nouvelle ligne dans le fichier
for ( $x=0; $x<=3; $x++ ) {
push @ligne_fich, nouvelle_donnee($x);
}
push @ligne_fich, "\n";
print FH @ligne_fich;
$a++;
#Ecrire les dernieres lignes dans le fichier
foreach ( @fin_fichier ) {
print FH $_ ;
$a++;
}
# TEST
foreach ( @fin_fichier ) { print $_; }

$nb_modif++;
}

# main :
do {
open (FH, "+< data.txt") or die $!;
$nb_ligne = lecture_fichier();
print "Le fichier contient $nb_ligne lignes\n";

ask "no de la ligne a modif ?";
$nb_ligne_modif = $prompt;

ask "modifier toute la ligne ou un element ?";
modif_ligne($prompt, $nb_ligne_modif);
close(FH);
} until ( $prompt eq "s" );