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 :

Lire fichier texte


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut Lire fichier texte
    Bonjour !

    J'aimerais écrire un programme en perl permettant de lire un fichier très simple/

    Fichier config :
    Cpu CRITIQUE: Taux d.utilisation du CPU = 94,32 %:
    Mem OK: Taux d.utilisation de la memoire = 43,51 %:
    J'ai plus ou moins réussi à le faire en bash grâce à awk et quelques if et echo (j'aimerais faire avec print en bash aussi) :

    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
    #! /bin/bash
     
    etat_cpu="$(awk -F ":" '{print $1}' config | grep Cpu)"
    details_cpu="$(awk -F ":" '{print $2}' config | grep CPU)"
     
    if [ "$etat_cpu" == "Cpu OK" ]; then
    echo "OK - $details_cpu";
    exit 0
    fi
     
    if [ "$etat_cpu" == "Cpu ATTENTION" ]; then
    echo "Attention - $details_cpu";
    exit 1
    fi
     
    if [ "$etat_cpu" ==  "Cpu CRITIQUE" ]; then
    echo "Critique - $details_cpu";
    exit 2
    fi
    J'aimerais faire la même chose en perl, mais je bloque un peu

    Voici 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
    19
    20
    #!/usr/bin/perl -w
    use strict;
     
    my $etat_cpu = `awk -F ":" '{print $1}' config | grep Cpu`
    my $details_cpu = `awk -F ":" '{print $2}' config | grep CPU`
     
    if ( my $etat_cpu eq "Cpu OK" ) {
    print "OK - $details_cpu";
    exit 0;
    }
     
    if ( my $etat_cpu eq "Cpu ATTENTION" ) {
    print "Attention - $details_cpu";
    exit 1;
    }
     
    if ( my $etat_cpu eq "Cpu CRITIQUE" ) {
    print "Critique - $details_cpu";
    exit 2;
    }
    Et j'ai ces belles erreurs :

    "my" variable $etat_cpu masks earlier declaration in same statement at ./check_perltest.pl line 7.
    syntax error at ./check_perltest.pl line 5, near "my "
    Global symbol "$details_cpu" requires explicit package name at ./check_perltest.pl line 5.
    syntax error at ./check_perltest.pl line 10, near "}"
    Execution of ./check_perltest.pl aborted due to compilation errors.
    Je débute en perl, merci de m'aider !

  2. #2
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut
    Après de multiples essais :

    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
    #!/usr/bin/perl -w
    use strict;
     
    my $etat_cpu = "awk -F ':' '{print $1}' config | grep Cpu";
    my $details_cpu = "awk -F ':' '{print $2}' config | grep CPU";
     
    if ( $etat_cpu eq "Cpu OK" ) {
    print "OK - $details_cpu";
    exit 0;
    }
     
    if ( $etat_cpu eq "Cpu ATTENTION" ) {
    print "Attention - $details_cpu";
    exit 1;
    }
     
    if ( $etat_cpu eq "Cpu CRITIQUE" ) {
    print "Critique - $details_cpu";
    exit 2;
    }
    Je suis arrivé à ça :

    Use of uninitialized value in concatenation (.) or string at ./check_perltest.pl line 4.
    Use of uninitialized value in concatenation (.) or string at ./check_perltest.pl line 5.
    Merci de m'aider


    -EDIT : Bon j'ai essayé de mettre quelques points, mais je n'ai rien comme retour :

    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
     
    #!/usr/bin/perl -w
    use strict;
     
    my $etat_cpu = 'awk -F ' . ':' . '{print $1}' . 'config ' . '| grep Cpu';
    my $details_cpu = 'awk -F ' . ':' . '{print $2}' . 'config ' . '| grep CPU';
     
    if ( $etat_cpu eq "Cpu OK" ) {
    print "OK - $details_cpu";
    exit 0;
    }
     
    if ( $etat_cpu eq "Cpu ATTENTION" ) {
    print "Attention - $details_cpu";
    exit 1;
    }
     
    if ( $etat_cpu eq "Cpu CRITIQUE" ) {
    print "Critique - $details_cpu";
    exit 2;
    }
    Alors qu'avec le bash, j'obtiens ceci :
    Critique - Taux d.utilisation du CPU = 94,32 %
    Apparement il n'éxécute pas la commande pour mettre le résultat dans la variable mais enregistre la commande dans la variable

  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 seb974 Voir le message
    Apparement il n'éxécute pas la commande pour mettre le résultat dans la variable mais enregistre la commande dans la variable
    Ben forcément, tu ne lui indiques jamais qu'il s'agit d'une commande et qu'il faut l'exécuter... Au moins en bash tu mettais $() !

    Mais quel est l'intérêt de faire du bash en Perl ? Tant qu'à faire du Perl, autant utiliser du Perl et pas des commandes shell.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl
    use strict; use warnings;
    @ARGV = ('config');
    my ($etat_cpu, $details_cpu);
     
    while(<>) {
      last if ($etat_cpu, $details_cpu) = m/^Cpu (\w+): (.*)$/;
    }
     
    my %etat_exit = (OK => 0, ATTENTION => 1, CRITIQUE => 2);
    print "$etat_cpu - $details_cpu";
    exit $etat_exit{$etat_cpu};
    --
    Jedaï

  4. #4
    Membre averti
    Inscrit en
    Août 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 56
    Par défaut
    Merci ça fonctionne impec :p

    Mais tu pourrais m'expliquer ton code stp, ici surtout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(<>) {
      last if ($etat_cpu, $details_cpu) = m/^Cpu (\w+): (.*)$/;
    }
    Pas mal le perl

  5. #5
    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 seb974 Voir le message
    Merci ça fonctionne impec :p

    Mais tu pourrais m'expliquer ton code stp, ici surtout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(<>) {
      last if ($etat_cpu, $details_cpu) = m/^Cpu (\w+): (.*)$/;
    }
    lit les fichiers dont le nom est dans @ARGV, ici config, ligne par ligne, à chaque itération la ligne est placée dans la variable spéciale $_ qui est également la variable sur laquelle est appliquée par défaut l'expression régulière m//.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    last if ($etat_cpu, $details_cpu) = m/^Cpu (\w+): (.*)$/;
    Si tu ne connais pas encore les expressions régulières, je te conseille de les apprendre très vite, c'est un outil extraordinairement utile dans tous les domaines (et avec une très grande variété d'outils, pas seulement Perl). Ici cette expression régulière marchera pour une ligne qui commence par "Cpu " suivi par un mot, suivi par ": " puis par n'importe quoi jusqu'à la fin de la ligne. Si l'expression réussit, on stocke le mot et le n'importe quoi dans $etat_cpu et $details_cpu respectivement, puis on appelle 'last' pour sortir de la boucle de lecture.

    --
    Jedaï

  6. #6
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Citation Envoyé par seb974 Voir le message
    Apparement il n'éxécute pas la commande pour mettre le résultat dans la variable mais enregistre la commande dans la variable
    Et c'est normal, il fait exactement ce que tu lui demandes : affecter une chaîne de caractère à une variable scalaire. En l'occurrence, il faudrait utiliser des ` pour encadrer ta commande, plutôt que des guillemets ou des apostrophes.

    Mais il y a mieux à faire : se passer totalement d'appel système. En effet, Perl a été conçu, à l'origine, pour traiter, entre autres, le même genre de problèmes qu'awk, de façon plus souple. Il y a eu pas mal d'évolution, mais ça reste valable.
    Ça veut dire que faire appel à awk dans un script perl est aussi pertinent, disons, que d'interfacer un ordinateur avec une calculatrice de poche pour faire des opérations arithmétiques.

    Bon, je suis en train d'essayer de comprendre ce que tu cherches à faire, mais c'est pas évident. D'abord, que sont ces $1 et $2 qui trainent dans tes chaînes ? Tu sais que ces noms de variable ont une signification particulière en Perl, non ?

    EDIT : arf, doublé...

Discussions similaires

  1. java : lire fichier texte application web (war)
    Par drob38 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/07/2009, 23h31
  2. [VB.NET 2.0] lire fichier text
    Par Emcy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/12/2006, 08h45
  3. Lire fichier texte
    Par kinouseb dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 08/11/2006, 17h01
  4. Lire fichier texte en respectant la police, la forme
    Par loupin dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2006, 22h49
  5. Lire fichier Texte
    Par rprom1 dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 15/03/2006, 16h36

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