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

Programmation et administration système Perl Discussion :

Ecrire dans un fichier


Sujet :

Programmation et administration système Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Ecrire dans un fichier
    Bonjour à tous, je débute en Perl et surtout en programmation.

    Je suis entrain de mettre en place Nagios dans mon entreprise, très bonne solution cela dit en passant, et je cherche à faire un script afin de remplir plus facilement mes fichiers de configuration (et surtout éviter les erreurs).

    On m'a conseiller d'utiliser le Perl pour faire mes scripts.

    Donc voilà l'objectifs de mon scripts :

    il doit remplir les fichiers de configuration avec une chaine de caractère somme toute assez longue ou seul deux éléments sont modifiés (utilisation de variable). Donc la ça fait un petit moment que je me galère avec un cours de Mr LHULLIER.

    donc voici ce que j'ai pondu (bien sur ça ne fonctionne pas, sinon je ne serais pas la à vous embêter ).

    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
     
    my $i = 0;
    my $v = 52;
     
    for ($i < $v; $i+=1)
    {
     
    open (FIC, ">>/usr/local/nagios/etc/objects/network.cfg")
            printf  ("define service{\n");
            printf  ("use                    generic-service\n");
            printf  ("hostgroups              FI026-Switch\n");
            printf  ("service_description     type interface $i\n");
            printf  ("check_command           check_snmp!-C public -o ifType.$i\n");
            printf  ("}\n");
    close (FIC);
    exit(1)
    }
    la variables i se trouve sur les lignes "service_description" et "check_command".

    Je suis un peu dans l'impasse donc si quelqu'un a une idée ou même un conseil je prend avec plaisir.

    A sinon ça peut peu être aider les deux erreurs que j'ai à l'execution sont

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    syntax error at ./define-network.pl line 7, near "1)
    "
    syntax error at ./define-network.pl line 12, near ");"
    Execution of ./define-network.pl aborted due to compilation errors.

    Cordialement

    Raphaël.

    PS : Si vous souhaiter plus d'information n'hésiter pas à le faire savoir.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Bonjour, jeune débutant jedaï

    Plusieurs remarques pour commencer :

    1) apprends à utiliser les pragmas strict et warnings dès le départ, ça te forgera une manière de programmer plus propre.

    A indiquer en début de script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #! /usr/bin/perl -w
     
    use strict;
    use warnings;
    2) ta boucle for me semble incomplète. A moins que ça n'aie changé, il y a 3 conditions dans une boucle for : initialisation, fin de boucle, incrémentation.

    Ta boucle ne devrait-elle pas être plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 0; $i < $v; ++$i)
    ?

    3) il manque le point-virgule à la fin de cette ligne là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (FIC, ">>/usr/local/nagios/etc/objects/network.cfg")
    4) je ne comprend pas pourquoi tu ouvres une 50aine de fois le même fichier, pourquoi tu n'écris rien dedans et pourquoi tu utilises la fonction printf alors que print me semble plus simple à employer (surtout ici).


  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    d'abord merci pour la réactivité, ça fait plaisir

    Sinon je vais corriger ce que tu me dit...

    Juste une chose c'est quoi les

    use strict;
    use warnings;

    enfin la question c'est plutôt ça sert à quoi ???


    Cordialement

    Raphaël

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par robair Voir le message
    Juste une chose c'est quoi les

    use strict;
    use warnings;

    enfin la question c'est plutôt ça sert à quoi ???
    strict impose au développeur de déclarer chacune des variables qu'il utilise dans son script.

    warnings rend le compilateur/interpréteur de Perl plus bavard, ce qui te permet de savoir si ton code est nickel chrome ou s'il y a des risques par exemple que certaines variables ne soient pas correctement remplies.

    Clique sur le lien dans ma signature, tu sauras tout

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bon j'ai modifié mon code et j'ai placé l'ouverture du fichier avant la déclaration de la boucle for.

    ce qui donne le code suivant :

    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 -w
     
    use strict;
    use warnings;
     
    my $i;
    my $v = 52;
     
     
    open (FIC, ">>/usr/local/nagios/etc/objects/network.cfg");
     
     
    for ($i=0; $i < $v; ++$i)
    {
     
            printf  ("define service{\n");
            printf  ("use                    generic-service\n");
            printf  ("hostgroups              FI026-Switch\n");
            printf  ("service_description     type interface $i\n");
            printf  ("check_command           check_snmp!-C public -o ifType.$i\n");
            printf  ("}\n");
    }
    close (FIC);
    exit(1)

    par contre il m'affiche bien le résultat que je souhaite dans le shell mais par contre il n'écrit rien dans le fichier. J'exécute pourtant le programme avec l'utilisateur root (donc logiquement ce n'est pas un problème de droit).

    Donc je suppose que ce n'est pass printf qu'il faut utiliser pour écrire dans un fichier (en fin de fichier qui plus est). Si quelqu'un sait n'hésitez pas à m'en faire part. Je continue mes recherches de mon coté.

    cordialement

    Raphaël

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par robair Voir le message
    Donc je suppose que ce n'est pass printf qu'il faut utiliser pour écrire dans un fichier (en fin de fichier qui plus est).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    open (FIC, ">>/usr/local/nagios/etc/objects/network.cfg");
     
     
    for ($i=0; $i < $v; ++$i)
    {
     
            print FIC "blablabla";
    }
    close (FIC);
    printf sert pour la mise en forme.
    -- Jasmine --

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    bon finalement j'ai trouver la solution tout seul comme un grand

    en fait j'avais oublier le descripteur du fichier :

    donc les lignes printf donne :

    printf (FIC "define service{\n");

    et la ça marche.

    Par contre une dernière chose.

    Chaque bloque de texte et coller l'un à l'autre. Pour une meilleur lisibilité du fichier je souhaiterais laisser une ligne entre chaque bloc.

    Comment je fait j'ai tenter un printf (FIC "\n");

    mais il est pas d'accord


    quelqu'un aurait pas une idée

    Cordialement

    Raphaël

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par robair Voir le message
    Donc je suppose que ce n'est pass printf qu'il faut utiliser pour écrire dans un fichier (en fin de fichier qui plus est).
    printf est très puissant pour écrire (y compris dans un fichier) mais dans ton cas, pas de prise de tête (surtout que tu débutes), autant utiliser print à la place.

    Jasmine80 a donné un exemple nickel, quant à son utilisation

  9. #9
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Chaque bloque de texte et coller l'un à l'autre. Pour une meilleur lisibilité du fichier je souhaiterais laisser une ligne entre chaque bloc.

    Comment je fait j'ai tenter un printf (FIC "\n");

    mais il est pas d'accord
    -- Jasmine --

  10. #10
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    oulah j'avais pas vu certaine réponse merci à tous les deux en tout cas. Vous m'enlever une belle épine du pied.

    Et maintenant je peux même dire je sais faire un script en perl

    Ouh les chevilles on va se calmer

    Bon sait on jamais ça peut servir à quelqu'un d'autre, voici mon code fonctionnel :

    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
    #! /usr/bin/perl -w
     
    use strict;
    use warnings;
     
    my $i;
    my $v = 52;
     
     
    open (FIC, ">>/usr/local/nagios/etc/objects/networktest.cfg");
     
     
    for ($i=0; $i < $v; ++$i)
    {
     
            printf  (FIC "define service{\n");
            printf  (FIC "use                    generic-service\n");
            printf  (FIC "hostgroups              FI026-Switch\n");
            printf  (FIC "service_description     type interface $i\n");
            printf  (FIC "check_command           check_snmp!-C public -o ifType.$i\n");
            printf  (FIC "}\n");
            printf  FIC "\n";
    }
    close (FIC);
    exit(1)
    Voilà je passe le poste en résolu. Merci encore à vous tous pour votre aide qui m'a été plus que précieuse.

    à bientôt sur les forums de devellopez.com, bonne journée à tous

    Cordialement.

    Raphaël

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

Discussions similaires

  1. Ecrire \" dans un fichier
    Par photorelief dans le forum Langage
    Réponses: 2
    Dernier message: 14/09/2005, 15h56
  2. [JAR] Lire et Ecrire dans un fichier contenu dans un jar
    Par lipao17 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/05/2005, 12h01
  3. Ecrire dans un fichier
    Par gibet_b dans le forum Linux
    Réponses: 5
    Dernier message: 25/04/2005, 20h11
  4. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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