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

Barichon Messages postés 19 Statut Membre -  
 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
Configuration: Linux
Mozilla 1.9.0.15

7 réponses

  1. Barichon Messages postés 19 Statut Membre
     
    Pour aider dans votre aide, résultat attendu:

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

    Perso, je ne trouve pas.

    Merci d'avance.

    Romain
    0
  2. toto1983 Messages postés 161 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
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  4. Barichon Messages postés 19 Statut Membre
     
    merci de ta réponse,

    Je penses pas je fais un banal close FD;

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

    Posez votre question
  6. Barichon Messages postés 19 Statut Membre
     
    Personne n'est en mesure de m'aider svp ?
    0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  8. 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