IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

tie::file ne remplace pas


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 47
    Points
    47
    Par défaut tie::file ne remplace pas
    bonjour,

    souhautant modifier une ligne d'un fichier sans jamais toucher au reste, je me suis tourné vers tie::file

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #!/usr/bin/perl -w
    use strict;
    	use Tie::File;
            my $nouvelle_liste="";
            my $ancienne_liste="";
            open FICHIER,"< liste_tor.txt" or die "Le fichier liste_tor.txt n'existe pas !";
            my $ligne;
            while ($ligne = <FICHIER>)
            {
                  $nouvelle_liste.=$ligne;
            }
            close FICHIER;
             open FICHIER,"< liste_fixe.txt" or die "Le fichier liste_fixe.txt n'existe pas !";
            while ($ligne = <FICHIER>)
            {
                  $nouvelle_liste.=$ligne;
            } 
            close FICHIER;
     
             open FICHIER,"< ancienne_liste.txt" or die "Le fichier ancienne_liste.txt n'existe pas !";
            while ($ligne = <FICHIER>)
            {
                  $ancienne_liste.=$ligne;
            } 
            close FICHIER;
     
     
     
     
     
            my @tableau1;
    	tie @tableau1, 'Tie::File', "framearticle.html" or die ("probleme avec le fichier 1");
     
    	for (@tableau1)
            {s/{$ancienne_liste}/{$nouvelle_liste}/g;}
    	untie @tableau1;            # all finished
     
            my @tableau2;
    	tie @tableau2, 'Tie::File', "framefollow.html" or die ("probleme avec le fichier 2");
     
    	for (@tableau2)
            {s/{$ancienne_liste}/{$nouvelle_liste}/g;}
    	untie @tableau2;            # all finished
     
              my @tableau3;
    	tie @tableau3, 'Tie::File', "frameheader.html" or die ("probleme avec le fichier 3");
     
    	for (@tableau3)
            {s/{$ancienne_liste}/{$nouvelle_liste}/g;}
    	untie @tableau3;            # all finished
     
            my @tableau4;
    	tie @tableau4, 'Tie::File', "framepreview.html" or die ("probleme avec le fichier 4");
     
    	for (@tableau4)
            {s/{$ancienne_liste}/{$nouvelle_liste}/g;}
    	untie @tableau4;            # all finished
     
     
            open FICHIER,"> ancienne_liste.txt" or die "probleme avec le fichier ancienne liste !";
     
            print FICHIER $nouvelle_liste;
            close FICHIER;

    normalement le motif $ancienne_liste devrait etre remplacé dans les fichiers frame*.html par $nouvelle_liste pourtant il n'en est rien.
    quelqu'un peut il m'aider ?

  2. #2
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Bonsoir.

    Je ne comprends pas bien ce que tu veux faire. Que doit faire exactement ton script ?

    Pour l'instant, tu concatènes les lignes des fichier liste_tor.txt et liste_fixe.txt les unes à la suite des autres dans la chaîne $nouvelle_liste. Tu concatènes de même les lignes de ancienne_liste.txt dans $ancienne_liste. Le procédé que tu utilises est plutôt étrange, pour ne rien dire de la finalité. Je me demande si tu réalise que tes listes sont des chaînes.

    Puis lors de tes substitutions, tu remplaces toutes les occurrences d'une chaîne qui vaut dorénavant les deux premiers fichiers concaténés l'un à la suite de l'autre par une chaîne contenant les lignes de ton troisième fichiers, ou plus exactement ces deux chaînes entourées de { }.

    Est-ce vraiment ce que tu veux ? Que veux-tu faire ? (Je te fais grâce du coup de la boule de cristal).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    bonjour,
    je sais que liste_tor et liste_fixe se concatenent, elles ont pour role de constituer $nouvelle_liste.

    par ailleurs, dans les 4 fichiers frame*.html, il existe un motif $ancienne_liste que je souhaite remplacer par $nouvelle_liste (d'ou le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s/{$ancienne_liste}/{$nouvelle_liste}/g
    )

    je souhaite effectuer ce remplacement qui a priori, est une substitution de ligne, sans jamais effacer ou meme modifier partiellement le reste des fichiers frame*.html, je n'en ai pas le droit, c'est le remplacement qui ne fonctionne pas dans ce script


    pour les chaines entourées d'accolades, c'est à priori la syntaxe pour subsituer des variables en lieu et places de motifs avec la fonction de substitution s///

    Algorithme :

    1 on concatene les contenus de liste_tor.txt et liste_fixe.txt pour créer $nouvelle_liste (les fichiers liste_tor.txt et liste_fixe.txt sont updatés régulièrement par un autre script)

    2 on recupere le contenu de ancienne_liste.txt dans $ancienne_liste

    3on remplace la ligne qui contient le motif $ancienne_liste par le motif $nouvelle_liste dans chacun des 4 fichiers frame*.html sans effacer quoi que ce soit d'autre dans ces fichiers meme temporairement

    4 on fait de notre $nouvelle_liste le contenu du fichier ancienne_liste.txt comme ça on va pouvoir updater en boucle les fichiers frame*.html

  4. #4
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    pour les chaines entourées d'accolades, c'est à priori la syntaxe pour subsituer des variables en lieu et places de motifs avec la fonction de substitution s///
    Non. Pour t'en persuader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $_ = '{ab}';
    my $a = 'ab';
    my $b = 'x';
    s/$a/$b/; print;
    s/{$b}/$a/; print;
    Quant à ton utilisation de tie, j'ai l'impression que tu te compliques inutilement la tâche — mais comme on ne sait pas ce que doit faire le script en fin de compte .

    Considère l'exemple (idiot) suivant qui substitue Perl à toute occurrence de PERL, pERL, perl etc dans un fichier test.txt du répertoire courant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!usr/bin/perl -w
    use strict;
    use Tie::File;
    tie my @array, 'Tie::File', 'test.txt' 
        or die "Could not either open or tie: $!";
    my $name = 'perl';
    for (@array) {
        s/($name)/\L\u$1/i;
    }
    Au fait, as-tu regardé la doc sur Tie::File (perldoc Tie::File) ? Jette peut être aussi un oeil à perlretut.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par iblis Voir le message
    Non. Pour t'en persuader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $_ = '{ab}';
    my $a = 'ab';
    my $b = 'x';
    s/$a/$b/; print;
    s/{$b}/$a/; print;
    merci bien

    Citation Envoyé par iblis Voir le message
    Quant à ton utilisation de tie, j'ai l'impression que tu te compliques inutilement la tâche —
    utilisation cf. http://perldoc.perl.org/Tie/File.html

    Citation Envoyé par iblis Voir le message
    mais comme on ne sait pas ce que doit faire le script en fin de compte .
    expliqué ci dessus précisement sous forme de l'algo en 4 étapes


    Citation Envoyé par iblis Voir le message
    Au fait, as-tu regardé la doc sur Tie::File (perldoc Tie::File)
    oui, mon code vient de là. c'est juste la syntaxe avec les accolades pour se servir de variables avec la fonction de substitution, résolu donc, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tie::File n'ecrit pas
    Par mnem0 dans le forum Langage
    Réponses: 0
    Dernier message: 30/01/2008, 03h43
  2. Probleme performance, parametrage Tie::File
    Par djibril dans le forum Modules
    Réponses: 9
    Dernier message: 06/06/2007, 22h02
  3. Tie::File
    Par Jedai dans le forum Modules
    Réponses: 1
    Dernier message: 25/03/2006, 18h46
  4. Réponses: 10
    Dernier message: 24/01/2005, 17h00
  5. Le '%' en SQL ne remplace pas les espaces...
    Par njac dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/09/2004, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo