[PERL] Comment écrire à la fin d'un fichier..

Barichon Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
 lami20j -
Bonjour,

Je cherche un moyen d'écrire en perl à la fin d'un fichier, moins 9 caractères.

Voici mon programme, mais ça ne marche pas:

#ouverture du fichier à proprement dit:
open FD, ">> ".$config->{logfile};

#Décalage de 9 caractères avant la fin du fichier
seek FD, -9,2;

#Ecriture pour tester
print FD "test-test-test\n"


Sachant que le fichier que j'écris est de cette forme:

<SOURCE>
</SOURCE>
# d'ou le besoin de 9 caractères pour écrire avant cette balise fermante.


Merci par avance pour votre aide ;)

Romain
A voir également:

7 réponses

Barichon Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Pour aider dans votre aide, résultat attendu:

<SOURCE>
test-test-test
</SOURCE>

Perso, je ne trouve pas.


Merci d'avance.

Romain
0
toto1983 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   13
 
Peut être ta commande de sortie qui va pas ? mauvaise synthaxe ou pas adaptée ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention  
 
hello
ne serait-ce pas qu'après avoir "reculé" de 9, il écrase le texte, au lieu de l'insérer. le >> du open n'ajoute qu'à la fin du fichier
0
Barichon Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
merci de ta réponse,

Je penses pas je fais un banal close FD;

...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Barichon Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Personne n'est en mesure de m'aider svp ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention  
 
je pense qu'il faut lire chaque ligne du fichier, l'écrire en ajoutant ton texte avant d'écrire la dernière ou utiliser un outil comme sed
0
lami20j
 
Salut,

Selon ton cas exposé voici une solution (les éventuelles lignes à la fin sont prises en compte), mais il ne faut pas généraliser la solution.

La solution ne tient pas compte des 9 caractères (en fait tu as oublié le caractère de saute de ligne et les éventuelles caractères non-imprimables qu'on ne les vois pas).
Je me suis contenté d'écrire avant la ligne </SOURCE> de la fin dans l'exemple que tu as montré (je ne dit pas de la fin de ton fichier)
Tu peux tester sur un fichier qui n'as pas des lignes vides à la fin par exemple.

Le fichier sur lequel j'ai testé
lami20j@debian:~$ cat fichier.txt

dlfk
kdkf
<SOURCE>
</SOURCE>




lami20j@debian:~$ 


Le script

lami20j@debian:~$ cat insert2last.pl
#!/usr/bin/perl
use strict;use warnings;
 
open F,"fichier.txt";
open FF,">fichier_resultat";
my $n=0;
 
for(reverse <F>){
  chomp;               # suppression saut ligne
  length==0?$n++:last; # compter les lignes vides
                       # sortir de boucle des que 1ère ligne non-vide est rencontrée
}
 
while(<F>){};  # pour la variable $. (nombre de lignes de fichier)
my $i=$.-$n-2; #-1 puisque index commence à zéro
               #-1 pour ne pas prendre la dernière ligne non vide
seek(F,0,0);   #déplacement au début du fichier
print FF ((<F>)[0..$i]),"test-test-test\n"; # tranche de liste jusque l'avant dernière ligne
                                                   # non-vide du fichier
seek(F,0,0);
print FF ((<F>)[$i+1..$i+$n+1]); # tranche de liste de la dernière ligne non-vide
                                 # jusqu'à la fin de fichier
__END__
 


Le résultat

lami20j@debian:~$ cat fichier_resultat

dlfk
kdkf
<SOURCE>
test-test-test
</SOURCE>




lami20j@debian:~$ 
0