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

Langage Perl Discussion :

[langage] [Fichier]problème modification de fichier


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 52
    Points : 52
    Points
    52
    Par défaut [langage] [Fichier]problème modification de fichier
    Voici mon code.
    Il est sensé ouvrir en lecture/écriture et modifier un fichier nommé windyc.txt
    Le fichier windyc.txt contient 6 lignes égales à la chaine de caractère "lulu" que je veux changer en "lili".

    Mon problème est que le programme n'entre pas dans la boucle while ci-desous. Je le sais parce que l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "entree dans le while\n";
    n'est pas exécutée.

    Je bosse sous windows.
    Merci pour l'aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/local/bin/perl
        $w="windyc.txt";
        $ancien="lulu";
        $nouveau="lili";
               if(open(TOTO,">>$w")){print "ouverture en ecriture du fichier $w\n";}
             else {die("impossible d'ouvrir le fichier $w\n Erreur $!\n");}
             print "avant le while\n";
              while(<TOTO>) {
                print "entree dans le while\n";
                    $_ =~ s/$ancien/$nouveau/g;
                    print TOTO $_; print TOTO "toto";
              }
            close(TOTO);
    ----------------------------------
    Let the feast, start !
    Vitamines pour l'esprit : http://www.batisseurs-de-succes.com/

  2. #2
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    Sous windows avec un shebang pareil ???
    t'as essayé de lancer un ?
    Tu bosses en cgi ? (ça a pas l'air)
    Mais à priori ton code a l'air bon...
    Si ce n'est le use strict qui est fortement conseillé !!

    Essaie de mettre le contenu de ton fichier dans un tableau et d'afficher le contenu du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @tab = <TOTO>;
    foreach(@tab) {print "\n$_"; }
    Verre vide je te plains, verre plein, je te vide.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    Effectuvement je ne travaille pas en cgi.
    Je veux juste faire un script qui modifiera rapidement des fichiers.
    J'ai une centaine de fichiers à modifier dans l'arborscence de mes répertoires et on m'a dit que perl est très adapté pour cela alors j'ai du mettre au perl Jeudi dernier.

    Sinon, as-tu testé mon script ?

    A quoi sert le use strict dont tu me parles dans ton message ?

    Merci
    ----------------------------------
    Let the feast, start !
    Vitamines pour l'esprit : http://www.batisseurs-de-succes.com/

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    J'ai juste rajouté use strict au début du script et j'ai utilisé la commande

    (file.pl étant le nom du script)

    et voici les erreurs que j'obtiens:

    Global symbol "$w" requires explicit package name at file.pl line 3.
    Global symbol "$ancien" requires explicit package name at file.pl line 4.
    Global symbol "$nouveau" requires explicit package name at file.pl line 5.
    Global symbol "$w" requires explicit package name at file.pl line 7.
    Global symbol "$w" requires explicit package name at file.pl line 7.
    Global symbol "$w" requires explicit package name at file.pl line 8.
    Global symbol "$ancien" requires explicit package name at file.pl line 12.
    Global symbol "$nouveau" requires explicit package name at file.pl line 12
    Execution of file.pl aborted due to compilation errors.
    Qui a une idée de mon problème ?
    ----------------------------------
    Let the feast, start !
    Vitamines pour l'esprit : http://www.batisseurs-de-succes.com/

  5. #5
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    Ces erreurs signifient que tu dois déclarer tes variables. Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ($w,$ancien,$nouveau);
    Le use strict t'oblige à une syntaxe plus rigoureuse, entre autres à bien déclarer tes variables(pour un code plus lisible et un débuggage plus facile).
    Une fois cela fait, relances un perl -w file.pl.
    Verre vide je te plains, verre plein, je te vide.

  6. #6
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    J'ai testé ton code et il s'avère qu'il semble que tu ne puisses pas ouvrir un fichier en lecture/écriture...Très bizarre, j'en conviens.
    La solution, ouvrir ton fichier source en lecture, mettre le contenu dans un tableau, fermer ton fichier, le réouvrir en écriture seule (">$w") et écrire chaque ligne de ton tableau dans ton fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    open(FICH,"$w") || die ("Ouverture de $w impossible : $!");
    my @tab = <FICH>;
    close(FICH);
    open(FICH,">$w") || die ("Ouverture de $w impossible : $!");
    foreach(@tab) {
        print FICH;
    }
    close(FICH);
    Si tes fichiers sont de taille importante, il vaut mieux passer par un fichier intermédiaire plutôt que par un tableau.

    Sinon, changes ton shebang...le tien a la forme d'un shebang sous unix...
    Si t'es sous windows, il devrait être de la forme :
    Remarques, je crois qu'un "perl" suffit si le chemin vers l'interpréteur est bien renseigné dans la variable d'environnement PATH.
    Verre vide je te plains, verre plein, je te vide.

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Euh... le shebang n'a absolument aucune importance sous windows, donc autant en mettre un qui a une chance de marcher sous Unix, non ?

    Par ailleurs on peut ouvrir un fichier en mode lecture-écriture, mais c'est très peu utilisé sauf lorsqu'on manie un fichier avec des champs de longueurs fixes, type base de donnée... Pas le cas ici, donc, bien que les modifications prévues soit à priori réalisables vu que lili et lulu ont la même longueur. Par contre, le fichier est mal ouvert, en effet ">>" ouvre un fichier en mode "ajout" (c'est une convention shell très répandue), c'est à dire qu'elle ouvre le fichier en écriture (pas en lecture à priori) mais à la fin du fichier... Il est donc normal que l'on n'entre pas dans la boucle, il n'y a rien à lire (et de toute façon on ne peut pas...). La syntaxe correcte pour ouvrir un fichier en lecture-écriture est "+<", à ne pas confondre avec "+>" qui ouvre bien le fichier en lecture-écriture mais en effaçant le contenu au préalable...

    Maintenant, il faut bien comprendre que travailler en lecture-écriture est ch**** même dans les cas qui s'y prêtent, comme ici. Il est bien plus facile de travailler avec un fichier temporaire dans lequel on écrit la version modifiée et qu'on renomme après de façon à ce qu'il écrase la version ancienne. Sauf cas extrèmement rare, la différence en performance n'a absolument aucune importance vu la rapidité des ordinateurs actuels.


    (Je peux donner les détails pour procéder en lecture-écriture, mais c'est vraiment pas une bonne idée...)

    --
    Jedaï

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/04/2010, 17h27
  2. [langage] variable dans le path d'un fichier
    Par caro_du_94 dans le forum Langage
    Réponses: 2
    Dernier message: 21/10/2004, 12h03
  3. Réponses: 4
    Dernier message: 02/07/2004, 19h14
  4. [ICS FtpClient] Date modif de fichier et listage de dossier
    Par Ingham dans le forum Composants VCL
    Réponses: 8
    Dernier message: 13/06/2004, 19h54
  5. modification de fichier EOF
    Par scorbo dans le forum C
    Réponses: 9
    Dernier message: 28/11/2003, 11h35

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