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 :

Parser en Perl d'un fichier txt


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut Parser en Perl d'un fichier txt
    Bonjour,

    Je souhaite faire un parser en Perl afin de parcourir un fichier, d'y récupérer des informations, puis les écrire dans un autre, pour l'instant quelque chose de basique..

    Je débute complétement le Perl donc je suis un peu perdu et mon code ne marche pas

    Par exemple mon fichier qui se faire lire par le parser est :

    aaaaatest32aaaaa
    zzzztest24zzzzz
    ztest12zzzzzz
    bbbbbbtest44
    Voici le début de mon code :

    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
    #!usr/bin/perl -w 
    use strict; 
    user warning; 
     
    my $var1 = ""; 
     
    #print "Début du traitement" 
     
    open FICHIER,"<monfichier.txt" or die "E/S : $!\n"; 
    open ECRIRE,">montest.txt" or dir ("Erreur de création de  montest.txt"); 
    while (my $ligne = <FICHIER>){ 
     if ($ligne =~ /\s*(test\2w*)/{ 
     $var1 = "recherche du mot test dans la ligne " : $1; 
     } 
     
    close FICHIER; 
    close ECRIRE; 
    #print "Fin du traitement"


    Je voudrais donc que dans mon fichier montest.txt soit écrit :
    test32
    test24
    test12
    test44

    Merci d'avance pour votre aide pour corriger mon code qui ne fonctionne pas et d'éventuelle évolutions !

  2. #2
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut

  3. #3
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Bonjour,

    le devrait plutot être
    Aussi, ton while n'a pas de '}' ...

    Ce sont des erreurs de copier-coller ?

    Aussi il faudrait penser à indenter ton code correctement, ce n'est vraiment pas lisible.

    Essai de voir avec ça
    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
     
    #!usr/bin/perl -w 
    use strict; 
    use warnings; 
     
    my $var1 = ""; 
     
    #print "Début du traitement" 
     
    open FICHIER,"<monfichier.txt" or die "E/S : $!\n"; 
    open ECRIRE,">montest.txt" or dir ("Erreur de création de  montest.txt"); 
    while (my $ligne = <FICHIER>)
    { 
        if ($ligne =~ /test[0-9]*/)
        { 
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
    	 print "Mot  : $ligne \n"; 
        } 
    }
    close FICHIER; 
    close ECRIRE; 
    #print "Fin du traitement"

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il est également possible de remplacer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if ($ligne =~ /test[0-9]*/)
        { 
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
    	 print "Mot  : $ligne \n"; 
        }
    par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (my ($test) = $ligne =~ /(test\d+)/)
        { 
    	 print "Mot  : $test \n"; 
        }
    ce qui n'altère pas $ligne (note au passage que [0-9]* s'est transformé en \d+, notamment pour ne pas matcher le mot "test" sans chiffre à la suite).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Merci pour vos réponses, c'est déjà mieux effectivement !
    Par contre pouvez vos m'expliquer avec des commentaires dans le code svp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (my $ligne = <FICHIER>)
    { 
        if ($ligne =~ /test[0-9]*/)
        { 
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
    	 print "Mot  : $ligne \n"; 
        } 
    }
    Voila ce que j'arrive a comprendre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #tant qu'il y a des lignes dans le fichier
    while (my $ligne = <FICHIER>)
    { 
        #pourquoi [0-9]?
        if ($ligne =~ /test[0-9]*/)
        { 
    	 #ligne qui sera copié dans l'autre fichier mais c'est flou...
             $ligne=~ s/.*(test[0-9]*).*/$1/;
             # ??? écrit Mot : la valeur stocké dans ligne ?
    	 print "Mot  : $ligne \n"; 
        } 
    }
    Je suis vraiment débutant dans ce langage, merci pour vos futurs réponses.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Avec les commentaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        # Si la ligne contient "test" suivi éventuellement de chiffres ([0-9]*)
        if ($ligne =~ /test[0-9]*/)
        { 
            # Remplacer dans la ligne, tout ce qui se trouve autour de "test[0-9]*" (y compris ce motif) par ce motif
    	$ligne=~ s/.*(test[0-9]*).*/$1/;
             # Imprimer "Mot : " suivi de la nouvelle ligne
    	 print "Mot  : $ligne \n"; 
        }
    Et ma proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        # Si le motif "test" suivi d'au moins un chiffre est trouvé, l'extraire dans $test et
        if (my ($test) = $ligne =~ /(test\d+)/)
        { 
             # imprimer "Mot : " suivi du motif trouvé
    	 print "Mot  : $test \n"; 
        }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Merci pour ta réponse, tout est bien sauf un petit soucis,

    Voici donc mon code actuel :

    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
     
    #!usr/bin/perl -w 
    use strict; 
    use warnings; 
     
    my $var1 = ""; 
     
    #print "Début du traitement" 
     
    #lire dans monfichier.txt 
    open FICHIER,"<monfichier.txt" or die "E/S : $!\n"; 
    #écrire dans mon test.txt
    open ECRIRE,">montest.txt" or dir ("Erreur de création de  montest.txt"); 
     
    #tant qu'il y a des lignes dans mon fichier
    while (my $ligne = <FICHIER>)
    { 
        # Si la ligne contient "test" suivi éventuellement de chiffres ([0-9]*)
        if ($ligne =~ /test[0-9]*/)
        { 
            # Remplacer dans la ligne, tout ce qui se trouve autour de "test[0-9]*" (y compris ce motif) par ce motif
    		$ligne=~ s/.*(test[0-9]*).*/$1/;
             # Imprimer "Mot : " suivi de la nouvelle ligne
    	 print "Mot  : $ligne \n"; 
        } 
     
    }
     
    #fermeture des fichiers
    close FICHIER; 
    close ECRIRE; 
    #print "Fin du traitement"
    Par contre quand je compile avec dans le cmd : perl parser.pl

    ll m'afficher a l'écran tout les print, me crée le fichier montest.txt mais il est vide

    Une idée ?

  8. #8
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    j'ai rajouté

    a la fin de monde code, tout est parfait merci ! =)

  9. #9
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    J'ai encore un petit soucis, après quelques tests,

    J'ai reussis a gérer les lignes vides et si il n'y a pas de mot " test " dans la ligne en changeant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (($ligne =~ /test[0-9]*/)|| ($ligne =~ s/\n\n/^M/g))
    Par contre je n'arrive pas a gérer si on rencontre 2 fois le mot " test " dans le ligne, il ne me prend que je premier ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($ligne =~ /test[0-9]*/)
    afin de gérer plusieurs fois le mot test

    Mais je bloque..

    Peux tu m'aider stp ?

  10. #10
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par oliviernouhi Voir le message
    J'ai reussis a gérer les lignes vides et si il n'y a pas de mot " test " dans la ligne en changeant
    Je préfère écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     next if $ligne != /test/ ;
    ce qui signifie que l'on passe à la ligne suivante (next est utilisable dans les boucles for et while) si la ligne ne contient pas != le motif entre //

    Citation Envoyé par oliviernouhi Voir le message
    Par contre je n'arrive pas a gérer si on rencontre 2 fois le mot " test " dans le ligne, il ne me prend que je premier ..
    Une manière de faire, documentée...
    Tu peux lancer ce code tel quel et l'adapter ensuite dans le tien :

    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
    #!/usr/bin/perl
     
    use strict ;
    use warnings ;
    use Data::Dumper ;
     
    # chaines a tester dans un tableau pour en tester plusieurs
    my @chaines = ("aaaaatestzzzzztest123uuuuu", "aaaatesthhhhh", "aaaaatest125852", "test", "test145") ;
    # pour chaque chaine que l'on veut tester
    foreach my $test ( @chaines ) {
        # on split la chaine suivant le motif test sans ou avec des chiffres derriere
        # on met le motif entre () pour récupérer aussi ce motif dans le tableau (sinon il est éliminé) 
        # le resultat du split se retrouve dans le tableau @test
        my @test = split(/(test\d*)/, $test) ;
        # on imprime la chaine de depart (pour DEBUG)
        print $test . "\n" ;
        # on imprime le contenu du tableau @test (pour DEBUG)
        print Dumper(\@test) ;
        # on fait ensuite un grep sur @test pour ne récupérer que les elements qui contiennent "test"
        my @res = grep { $_ =~ /test/ } @test ;
        # on imprime le tableau résultat (pour DEBUG)
        print Dumper(\@res) ;
        print "-------------------------------------\n" ;
    }

  11. #11
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Super Merci pour tout, a moi de bosser

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par fabrice91 Voir le message
    Je préfère écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     next if $ligne != /test/ ;
    ce qui signifie que l'on passe à la ligne suivante (next est utilisable dans les boucles for et while) si la ligne ne contient pas != le motif entre //
    Sauf erreur, ce n'est pas ce que cela signifie...
    Pour ignorer les lignes ne contenant pas test, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    next if $ligne !~ /test/;
    (opérateur !~)


    Pour ce qui est de traiter "toutes les occurrences" de test dans une ligne, c'est assez simple à partir de mon code précédent : au lieu d'un simple if, il suffit d'une foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        # Pour tous les motifs "test" suivi d'au moins un chiffre est trouvés
        foreach my $test ($ligne =~ /(test\d+)/g)
        { 
             # imprimer "Mot : " suivi du motif trouvé
    	 print "Mot  : $test \n"; 
        }
    Normalement, il n'y a pas lieu de traiter de manière particulière les lignes vides, puisqu'une ligne vide ne contient jamais "test...".
    Je ne comprends donc pas le besoin
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #13
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Points : 177
    Points
    177
    Par défaut
    En fait je ferais plutôt d'abord une première boucle de lecture du fichier en récupérant les lignes qui t'intéressent avec la méthode que je t'ai donné, puis au lieu de faire un print, tu fais un push de @res dans un tableau par exemple @final que tu auras initialisé en dehors de la boucle avec juste un
    et donc le push au lieu du print :
    Et puis tout à la fin, une fois que tu as fini de lire ton fichier et fais le close dessus, tu ouvres ton fichier dans lequel tu veux écrire et tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print ECRIRE join(@final,"\n") ;
    Ce qui va écrire toutes les lignes de final avec un saut à la ligne au bout de chaque ligne.
    D'ailleurs pour écrire dans un fichier, je préfère le format à 3 opérateurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    open my $OUT, ">", "mon_fichier.txt" ;
    print $OUT join(@final, "\n") ;
    close $OUT ;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $file = "mon_fichier.txt" ;
    open my $OUT, ">", $file ;
    print $OUT join(@final, "\n") ;
    close $OUT ;
    Le premier élément $OUT est le filehandler que tu vas utiliser ensuite pour écrire/lire ton fichier, le second élément détermine si tu es en lecture "<", en écriture ">", ou en append ">>" et le troisième élément, le nom du fichier lui-même.

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par fabrice91 Voir le message
    En fait je ferais plutôt d'abord une première boucle de lecture du fichier en récupérant les lignes qui t'intéressent avec la méthode que je t'ai donné, puis au lieu de faire un print, tu fais un push de @res dans un tableau par exemple @final que tu auras initialisé en dehors de la boucle avec juste un
    et donc le push au lieu du print :
    Et puis tout à la fin, une fois que tu as fini de lire ton fichier et fais le close dessus, tu ouvres ton fichier dans lequel tu veux écrire et tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print ECRIRE join(@final,"\n") ;
    J'aurais tendance à dire que cela dépend de ce que souhaite faire oliviernouhi. S'il souhaite travailler sur les lignes contenant "test", effectivement, les empiler dans une table peut avoir un intérêt.
    S'il ne s'agit que de faire un print, autant le faire au moment de la lecture. Je ne vois pas de raison pour compliquer la chose.
    D'ailleurs pour écrire dans un fichier, je préfère le format à 3 opérateurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    open my $OUT, ">", "mon_fichier.txt" ;
    print $OUT join(@final, "\n") ;
    close $OUT ;
    Entièrement d'accord.
    J'ajouterais :
    - ne pas oublier le "or die" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open my $OUT, ">", "mon_fichier.txt" or die "Can't open mon_fichier.txt: $!";
    - pour éviter toute ambiguïté, systématiquement utiliser un bloc autour du filehandle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print { $OUT } map "$_\n", @final;
    (map au lieu de join pour qu'il y ait un \n sur la dernière ligne).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  15. #15
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    merci encore pour votre aide, effectivement je suis début ta, ta méthode fabrice est bien mais pas évidente !!

    a bientot

  16. #16
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    J'aurais tendance à dire que cela dépend de ce que souhaite faire oliviernouhi. S'il souhaite travailler sur les lignes contenant "test", effectivement, les empiler dans une table peut avoir un intérêt.
    S'il ne s'agit que de faire un print, autant le faire au moment de la lecture. Je ne vois pas de raison pour compliquer la chose.
    Pour la maintenance et la réutilisation du code, je préfère prendre l'habitude de travailler avec des blocs fonctionnels, chacun faisant son boulot.
    A la limite tu peux faire une fonction pour la lecture du fichier, une fonction pour l'impression et ton "main" appelle simplement les deux fonctions. Si dans 2 semaines tu te rends compte que tu aimerais faire un peu plus de traitement lors de la lecture du fichier et la préparation des données, ca devient moins le bazar ! tu as juste à modifier la fonction de traitement.
    Si tu as envie de changer la manière dont tu sors tes résultats pour avoir une mise en page plus sexy, le simple print peut devenir plus compliqué et s'il est séparé ce sera plus facile et plus lisible à modifier...

    Citation Envoyé par Philou67430 Voir le message
    J'ajouterais :
    - ne pas oublier le "or die" :
    J'avoue ne jamais le faire...
    Parce que de toutes façons, s'il ne trouve pas le fichier, tu le sauras assez vite par un message d'erreur...
    Et puis un die, si tu es dans CGI, aie aie la sortie va être violente
    Donc plutôt faire un warn() ou alors utiliser Carp (use Carp) et faire un carp qui te donnera plus d'infos sur l'erreur et permettras de la gérer moins violemment...

  17. #17
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Points : 177
    Points
    177
    Par défaut
    Hop, voilà une petite façon de faire pour Olivier, on doit pouvoir faire certainement mieux, évidemment, ou bien différemment, avec plus ou moins de contrôle sur la gestion des erreurs...
    Enfin avec ce petit bout de code, tu vas pouvoir décortiquer 2/3 choses...

    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
    #!/usr/bin/perl
     
    use strict ;
    use warnings ;
    use Data::Dumper ;
    use Carp ;
     
    sub read_file($) {
        my $file = shift ;
        open my $IN, "<", $file || return 0 ;
        my $final ;
        while ( my $line = <$IN> ) {
            next if $line !~ /test/ ;
            my @test = split(/(test\d*)/, $line) ;
            my @res = grep { $_ =~ /test/ } @test ;
            push @$final, @res ;
        }
        return $final ;
    }
     
    sub print_file($$) {
        my $file   = shift ;
        my $final  = shift ;
        open my $OUT, ">", $file || return 0 ;
        print $OUT join("\n",@$final) ;
        close $OUT ;
        return 1 ;
    }
     
    my $file_in  = "text_in.txt" ;
    my $file_out = "text_out.txt" ;
     
    my $final = read_file($file_in) ;
    if ( not $final ) {
        print "A problem occurs while reading file $file_in\n" ;
        exit 0 ;
    }
     
    my $res = print_file($file_out, $final) ;
    if ( not $res ) {
        print "A problem occurs while writing file $file_out\n" ;
        exit 0 ;
    }
     
    exit 1 ;
    Tu l'appelles test.pl, chmod +x test.pl pour le rendre exécutable et tu le lances par ./test.pl en ligne de commande.
    Pour améliorer, tu peux mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $file_in  = $ARGV[0] ;
    my $file_out = $ARGV[1] ;
    et lancer alors le script par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./test.pl text_in.txt text_out.txt
    en tant qu'arguments.

  18. #18
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par fabrice91 Voir le message
    Si tu as envie de changer la manière dont tu sors tes résultats pour avoir une mise en page plus sexy, le simple print peut devenir plus compliqué et s'il est séparé ce sera plus facile et plus lisible à modifier...
    Je suis entièrement d'accord, et c'est exactement ce que je fais, mais seulement si c'est nécessaire (il est assez aisé de déplacer le corps d'un bloc de for dans une fonction).
    Mais j'avoue que dans mes travaux en perl, il y a beaucoup d'applications ultra-légère oneshot (des unilignes, des petits scripts), et des scripts plus complexes mais basés sur des traitements de fichiers très gros, pour lesquels l'approche fonctionnelle (qui nécessite souvent de charger complètement le fichier en mémoire), c'est pas possible ou facile à réaliser pour respecter les contraintes matérielles.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

Discussions similaires

  1. Comment parser un fichier.txt sous Access?
    Par takepaf dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 11h15
  2. Parser un fichier txt
    Par takepaf dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/05/2007, 11h29
  3. Réponses: 1
    Dernier message: 05/12/2006, 17h47
  4. Parser un fichier TXT
    Par Blaireau dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2006, 20h28
  5. [langage]parcours fichier txt en perl sous windows
    Par stef74 dans le forum Langage
    Réponses: 12
    Dernier message: 23/06/2005, 16h39

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