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 :

Substitution en perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut Substitution en perl
    voilà, je voudrais faire une suite de remplacement dans un fichier, via perl.

    quand je fais via un script, ça donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    perl -pi -e "s/blablabla *\n/blablabla /g" $fichier
    perl -pi -e "s/blablabla hihi/blablabla\nhihi/g" $fichier

    dans l'idée ou mon fichier serait du type:

    blablabla
    pouet
    blablabla
    hihi
    pour obtenir
    blablabla pouet
    blablabla hihi
    mais moi, je le veux dans un script perl
    j'ai testé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    open(FIC, $fichier);
    open(FIC2, >$temp);
    while($ligne= <FIC>) {
           $ligne =~ s/blablabla *\n/blablabla / ;
           $ligne =~ s/blablabla hihi/blablabla\nhihi/ ;
           printf FIC2 ("$ligne");
    }
    close(FIC);
    close(FIC2);
    seulement, ça fonctionne pas :/

    alors du coup, je trouverai ça emmerdant de devoir faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $console = `perl -pi -e "s/blablabla *\n/blablabla /g" $fichier` ;
    $console = `s/blablabla hihi/blablabla\nhihi/g" $fichier` ;
    pour executer du shell dans mon perl :/


    pour la note, je suis sous unix

  2. #2
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut
    tu veux enlever ou ajouter des saut de ligne ?

    tu fais pas ton substr à l'envers ? de plus si tu veux généraliser tu peut mettre s/""/""/g; (ca dépend si tu veux uniquement sur la première occurence ou sur toutes)

    edit lol tu l'a mis dans la ligne de commande ...
    Ca te donne quoi la ? rien ?

  3. #3
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par _Moa_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    open(FIC, $fichier);
    open(FIC2, >$temp);
    while($ligne= <FIC>) {
           $ligne =~ s/blablabla *\n/blablabla / ;
           $ligne =~ s/blablabla hihi/blablabla\nhihi/ ;
           printf FIC2 ("$ligne");
    }
    close(FIC);
    close(FIC2);
    Petites erreurs de syntaxe :
    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    use Fatal qw(open close rename);
     
    my $file = shift;
    open my($in), '<', $file;
    open my($out), '>', "$file.temp";
     
    while(<$in>) {
      s/blablabla *\n/blablabla / ;
      s/blablabla hihi/blablabla\nhihi/ ;
      print $out $_;
    }
    close $in;
    close $out;
    rename "$file.temp", $file;
     
    __END__
    --
    Jedaï

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut
    hum, j'ai un environnement assez allégé et les use passent pas...

    Et ensuite, j'ai droit à un jolie
    "Too many arguments for open ..."

    et sinon, pour la note, mon code fonctionnait mais à moitié...
    quand je faisais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while($ligne= <FIC>) {
           $ligne =~ s/blablabla *\n/blablabla / ;
           $ligne =~ s/blablabla hihi/blablabla\nhihi/ ;
           printf FIC2 ("$ligne");
    }
    la premiere transformation était faite, mais la seconde non, car les lignes ne sont pas "mise à jour" en faite.
    apres la premiere instruction, $ligne vaut "blablabla" il reprend pas la ligne suivante en enlevant le retour chariot.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut
    (suite du message, je sais pas pourquoi, ça bug que je le met entier)

    par contre, en inserant dans mon code
    $variable = `perl -pi -e "s/blablabla\n/blablabla/g" $fichier ` ;
    ça le fait directement sur tout le code.

    moi ce que je cherche, c'est justement d'appliquer directement une substitution à l'ensemble du fichier avec mon script perl, comme c'est possible en shell en appelant la fonction perl comme un sed, plutot que de devoir faire une lecture/ecriture de chaque ligne du fichier pour faire un cahngement...



    je sais pas si j'ai été clair

  6. #6
    Membre confirmé Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Par défaut
    A rien compris.

    En tous cas, bon courage et pouek !

  7. #7
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par _Moa_
    hum, j'ai un environnement assez allégé et les use passent pas...

    Et ensuite, j'ai droit à un jolie
    "Too many arguments for open ..."
    D'accord, tu dois avoir un Perl assez ancien (plus de 7 ans d'âge...).

    Tu pourrais nous donner le perl -V qu'on sache à quoi on a droit ?

    --
    Jedaï

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut
    This is perl, version 5.004_04 built for PA-RISC1.1

    Copyright etc ...

  9. #9
    Expert confirmé
    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
    Par défaut
    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    my $file = shift;
    open IN, "< $file"
      or die "$!\n";
    open OUT, "> $file.temp"
      or die "$!\n";
     
    while(<IN>) {
      s/blablabla *\n/blablabla / ;
      s/blablabla hihi/blablabla\nhihi/ ;
      print OUT $_;
    }
    close IN or die "$!\n";
    close OUT or die "$!\n";
    rename "$file.temp", $file;
     
    __END__
    Il doit avoir dans les 10 ans ce Perl...

    --
    Jedaï

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut
    ben, c'est la meme chose que ce que j'ai fait dans mon premier post, non?

  11. #11
    Expert confirmé
    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
    Par défaut
    Il manquait le "rename" si tu veux faire comme avec l'option -i .
    Par ailleurs si tu veux appliquer successivement les deux opérations de regex, je te conseille de faire ainsi :
    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    sub modify_in_place (&$);
     
    my $filename = shift;
    modify_in_place { s/blablabla *\n/blablabla / } $filename;
    modify_in_place { s/blablabla hihi/blablabla\nhihi/ } $filename;
     
    sub modify_in_place (&$) {
      my $block = shift;
      my $file = shift;
      local (*IN, *OUT);
      open IN, "< $file"
        or die "$!\n";
      open OUT, "> $file.temp"
        or die "$!\n";
     
      while(<IN>) {
        $block->();
        print OUT $_;
      }
      close IN or die "$!\n";
      close OUT or die "$!\n";
      rename "$file.temp", $file;
    }
     
     
    __END__
    Dis-moi si ça marche sur ton Perl (ça marche sur le mien). Sinon, j'essaierai de corriger.

    --
    Jedaï

  12. #12
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut
    ca marche, merci

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

Discussions similaires

  1. Efficacité substitution perl vs sed
    Par bougnbie dans le forum Langage
    Réponses: 4
    Dernier message: 24/01/2013, 17h52
  2. substitution, appel à votre expérience PERL
    Par PadawanInPerl dans le forum Langage
    Réponses: 1
    Dernier message: 01/10/2009, 11h10
  3. [Perl] Substitution lignes dans fichier
    Par latex_man dans le forum Langage
    Réponses: 5
    Dernier message: 06/11/2008, 13h58
  4. substitution perl -p0e
    Par tiboo dans le forum Langage
    Réponses: 1
    Dernier message: 30/01/2008, 14h58
  5. problème de substitution pour perl
    Par claire63 dans le forum Langage
    Réponses: 2
    Dernier message: 17/01/2008, 12h30

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