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

Signaler
Messages postés
19
Date d'inscription
mardi 29 septembre 2009
Statut
Membre
Dernière intervention
24 novembre 2009
-
 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

7 réponses

Messages postés
19
Date d'inscription
mardi 29 septembre 2009
Statut
Membre
Dernière intervention
24 novembre 2009

Pour aider dans votre aide, résultat attendu:

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

Perso, je ne trouve pas.


Merci d'avance.

Romain
Messages postés
205
Date d'inscription
samedi 16 mai 2009
Statut
Membre
Dernière intervention
25 mars 2010
13
Peut être ta commande de sortie qui va pas ? mauvaise synthaxe ou pas adaptée ?
Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 303
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
Messages postés
19
Date d'inscription
mardi 29 septembre 2009
Statut
Membre
Dernière intervention
24 novembre 2009

merci de ta réponse,

Je penses pas je fais un banal close FD;

...
Messages postés
19
Date d'inscription
mardi 29 septembre 2009
Statut
Membre
Dernière intervention
24 novembre 2009

Personne n'est en mesure de m'aider svp ?
Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 303
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
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:~$