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 :

Script perl RESEAU


Sujet :

Programmation et administration système Perl

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Merci !
    C'est agreable d avancer a petit pas.
    Jules

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Mais je continue avec mes questions.
    Pourquoi est-ce que je n'arrive pas a rentrer dans la seconde condition (elsif) alors que sur une meme ligne dans la lecture du fichier j ai un

    mon fichier
    ---------------
    [groupe] des_tab _et lan_toto
    ---------------------------------
    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
     
    # Vérification et ouverture du fichier base_Lan.txt pour la lecture
    open(Fichier_lan,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
    while ($ligne_fichier = <Fichier_lan> )
    {
             if (($ligne_fichier) =~ /\[(\S+)\]\t+\S/ ) #
             {
                    print "$1 \n";
             }
     
             elsif ( m/lan/ )
             {
                    print ("$1 \n");
             }
    }
    close Fichier_lan;

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Re petite question comment puis je gerer la variable $1 et lui donner un nom ?
    Merci
    Jule's

  4. #24
    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
    Citation Envoyé par calimero642
    Mais je continue avec mes questions.
    Pourquoi est-ce que je n'arrive pas a rentrer dans la seconde condition (elsif) alors que sur une meme ligne dans la lecture du fichier j ai un

    mon fichier
    ---------------
    [groupe] des_tab _et lan_toto
    ---------------------------------
    "elsif(){}" est un raccourci pour "else { if( ){ } }", donc si tu rentres dans le if, tu ne rentres pas dans le else et donc pas dans le elsif. Si tu veux qu'on puisse rentrer dans les deux pour la même ligne, il faut mettre deux if.

    Citation Envoyé par calimero642
    Re petite question comment puis je gerer la variable $1 et lui donner un nom ?
    Merci
    La variable $1 désigne le contenu capturé par la première paire de parenthèse de la dernière regex. On ne peut pas changer son nom. Mais on peut facilement l'assigner à une variable au nom plus significatif avant d'utiliser cette variable dans la suite du code.
    On peut également assigner directement le contenu capturé dans une regex à une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ($in_sbracket) = ($ligne_fichier =~ /\[(\S+)\]\t+\S/)
    (attention les parenthèses ont ici leur importance : elle donne le bon contexte à l'expression)

    --
    Jedaï

  5. #25
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Merci pour ton aide JEDAI mais pourquoi est ce que $Com_snmp ne m'affiche pas le nom de la communaute snmp serait ce l'exression reguliere qui n est pas correct ?
    Sachant que la boucle est verifiee autant de fois que le champ existe ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while ($ligne_fichier = <Fichier_lan> )
    {
          print("\n");
             if (my ($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ )) # permet de trouver le groupe qui est entre crochets
             {
                    print "Nom du groupe [$Groupe]\n"; # affiche lme nom du groupe
             }
     
             if (my ($Com_snmp)= (($ligne_fichier) =~/\].*\n/ )) # permet de trouver la communauté snmp du groupe
             {
                    print ("Nom de la communauté SNMP $Com_snmp"); #
             }
    }

    Merci Jules

  6. #26
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Rectification sur le dernier POST,

    La variable $Com_snmp m affiche 1, est ce que cela provient du faite que l'expression reguliere est verifiée ? 1 pour oui et 0 pour non ?
    Mais moi ce que je souhaiterai c est recuperer la valeur correspondant a l expression reguliere.

    Merci d avance Jules

  7. #27
    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
    Tu as oublié les parenthèses capturantes dans la regex...

    --
    Jedaï

  8. #28
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Merci JEDAI je viens enfin de comprendre l'utilisation precedente de $1 ou $2 ou $3 etc. C'est vraiment agreable de pouvoir comprendre jours a pres jours les mysteres du langage PERL.
    Merci
    Jules

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Maintenant je pe donner mon code qui selectionne les element que je voulais. Mais la question qui suit c est comment faire pour creer une base donnees qui va afficher ses information dans une page html, l'interet c est d avoir le fichier ou je cherche mes infos qui sera alimente a la main et qui permettra d obtenir une page web interactive avec les infos.

    Mais voici le code pour ceux que ca peut aider::

    [code]

    #!/usr/bin/perl


    # Vérification et ouverture du fichier base_Lan.txt pour la lecture
    open(Fichier_lan,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
    while ($ligne_fichier = <Fichier_lan> )
    {
    # print("\n");
    if (my ($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ )) # expression reguliere qui permet de trouver le groupe qui est entre crochets
    {
    print "\n Nom du groupe: [$Groupe]"; # affiche lme nom du groupe
    }

    if (my ($Com_snmp)= (($ligne_fichier) =~/\]\t+(.*)\n/ )) # expression reguliere qui permet de trouver la communauté snmp du groupe
    {
    print ("\t Nom de la communauté SNMP: [$Com_snmp] \n"); #
    }

    if (my ($Nom_switch)= (($ligne_fichier) =~/(\S+)\t+\d+\.\d+\.\d+\.\d+/)) # expression reguliere qui permet de trouver le nom du switch
    {
    print ("\tNom du switch: [$Nom_switch]"); #
    }

    if (my ($Addr_ip)= (($ligne_fichier) =~/\S+\t+(\d+\.\d+\.\d+\.\d+)/)) # expression reguliere qui permet de trouver l'@IP de chaque witch
    {
    print ("\t\t\t Adresse IP: [$Addr_ip]");
    print("\n");
    }
    }
    close Fichier_lan;
    [\code]

    et voila le fichier
    [code]

    [Groupe_Test] lanxxx

    switch-test 10.45.xx.xx
    switch-test1 10.45.xx.xx

    [Groupe_Serveurs] lanxxx

    switch-test1 10.45.xx.xx
    switch-test2 10.45.xx.xx
    switch-test3 10.45.xx.xx
    switch-test4 10.45.xx.xx
    switch-test5 10.45.xx.xx
    [\code]

    et le resultat est plutot sympa

    [code]
    Nom du groupe: [Groupe_Test] Nom de la communauté SNMP: [lanxxx]
    Nom du switch: [switch-test] Adresse IP: [10.45.11.22]
    Nom du switch: [switch-test1] Adresse IP: [10.45.22.33]

    Nom du groupe: [Groupe_Serveurs] Nom de la communauté SNMP: [lanxxx]
    Nom du switch: [switch-test1] Adresse IP: [10.45.33.44]
    Nom du switch: [switch-test2] Adresse IP: [10.45.55.66]
    Nom du switch: [switch-test3] Adresse IP: [10.45.66.77]
    Nom du switch: [switch-test4] Adresse IP: [10.45.88.99]
    Nom du switch: [switch-test5] Adresse IP: [10.45.00.11]
    [\code]


    Merci tous
    Jules

  10. #30
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Bonjour à tous, juste pour info il fait super beau en Alsace,
    voila j'ai une petite question concernant l'écriture dans un fichier et la portee des variables.

    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
     
    open(Fichier_lan,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
    open(Fichier_resultat,">resultat_info_switch") || die ("Vérifiez la présence du fichier resultat.txt ou son chemin à la ligne :\n $! ");
    while ($ligne_fichier = <Fichier_lan> )
    {
             if (my ($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ ))
             # expression reguliere qui permet de trouver le groupe qui est entre crochets
             {
                    print "\n Nom du groupe: [$Groupe]";
                    # affiche lme nom du groupe
             }
     
             if (my ($Com_snmp)= (($ligne_fichier) =~/\]\t+(.*)\n/ ))
             # expression reguliere qui permet de trouver la communauté snmp du groupe
             {
                    print ("\t\t\t Nom de la communauté SNMP: [$Com_snmp] \n"); #
             }
     
            if (my ($Nom_switch)= (($ligne_fichier) =~/(\S+)\t+\d+\.\d+\.\d+\.\d+/))
            # expression reguliere qui permet de trouver le nom du switch
             {
                    print ("\tNom du switch: [$Nom_switch]"); #
             }
     
            if (my ($Addr_ip)= (($ligne_fichier) =~/\S+\t+(\d+\.\d+\.\d+\.\d+)/))
            # expression reguliere qui permet de trouver l'@IP de chaque witch
             {
                    print ("\t\t\t Adresse IP: [$Addr_ip]");
                    print("\n");
             }
            print Fichier_resultat ( "$Groupe;$Com_snmp;$Nom_switch;$Addr_ip;\n");
    }
    close Fichier_lan;
    close Fichier_resultat;

    Dans le fichier ou je dois ecrire Fichier_resultat il n y a que les points virgules qui s y ecrivent !!!C'est du au variable qui ne valent plus rien en dehors de leur boucle ?


    Merci Jules

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    C'est bon c'était bien du a la protabilite des variables !!!c' était le "my" qui m'empechait de les utiliser !!
    Perl >>T es trop fort

  12. #32
    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
    Les variables déclaré avec my() sont locales, leur portée est restreinte au bloc où elles sont déclarées. On considère que la condition fait partie du bloc d'une conditionnelle ou d'une boucle. Donc tes variables n'existent pas lors de l'affichage et sont instanciées automatiquement à une valeur 'undef'.

    Tu devrais mettre 'use strict;' au début de ton script pour interdire à Perl de déclarer silencieusement des nouvelles variables, cela évite beaucoup d'erreurs. ('strict' est un pragma, c'est à dire qu'il modifie le comportement de perl, l'interpréteur, 'strict' est extrèmement recommandé pour tout le monde).

    Pour régler ton problème, il suffit de déclarer les variables préalablement :
    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
     
    while ($ligne_fichier = <Fichier_lan> )
    {
             my( $Groupe, $Com_snmp, $Nom_switch, $Addr_ip);
     
             if (($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ ))
             # expression reguliere qui permet de trouver le groupe qui est entre crochets
             {
                    print "\n Nom du groupe: [$Groupe]";
                    # affiche lme nom du groupe
             }
     
             if (($Com_snmp)= (($ligne_fichier) =~/\]\t+(.*)\n/ ))
             # expression reguliere qui permet de trouver la communauté snmp du groupe
             {
                    print ("\t\t\t Nom de la communauté SNMP: [$Com_snmp] \n"); #
             }
     
            if (($Nom_switch)= (($ligne_fichier) =~/(\S+)\t+\d+\.\d+\.\d+\.\d+/))
            # expression reguliere qui permet de trouver le nom du switch
             {
                    print ("\tNom du switch: [$Nom_switch]"); #
             }
     
            if (($Addr_ip)= (($ligne_fichier) =~/\S+\t+(\d+\.\d+\.\d+\.\d+)/))
            # expression reguliere qui permet de trouver l'@IP de chaque witch
             {
                    print ("\t\t\t Adresse IP: [$Addr_ip]");
                    print("\n");
             }
            print Fichier_resultat  "$Groupe;$Com_snmp;$Nom_switch;$Addr_ip;\n";
    }
    La "solution" d'omettre le my() n'est pas bonne car la déclaration implicite n'instancie que des variables globales, et donc pollue l'espace de nom (et la mémoire, Perl a un GC qui supprimera les variables locales quand tu quittes leur portée sans garder de références sur elles). C'est une bonne pratique que d'utiliser my() et strict, tu ne regretteras jamais de l'avoir adopté par la suite.

    --
    Jedaï

  13. #33
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Merci c 'est fait dc si j ai bien compris en mettant use strict au debut
    et en declarant les variables utilisees avec "my" elles sont innerantes au programmes et c est tout.

    Merci
    Jules

  14. #34
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Bonsoir,
    j'ai encore une petite question dans le fichier que je dois scruter il y a des lignes vides et d apres la doc y a moyen de selectionner le fichier et toutes ses lignes quin ne sont pas vides !
    Mais je dois avoir une couille car ca me dit merde !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while ($Ligne_Fichier = <Fichier_Lan> )
    {
     next if (($Ligne_Fichier) =~ /^$/)
            { 
     
                     if ( ($Groupe)=(($Ligne_Fichier) =~/\[(\S+)\]\t+\S/ ))
                    {
                            print "\n Nom du groupe: [$Groupe]";
                    }
           }

    Il me dit qu il y a une erreur de syntaxe ? Mais ou ?

    Merci d'avance Jules

  15. #35
    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
    L'idiome qui permet de sauter les lignes vides est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    next if $Ligne_Fichier =~ m/^$/;
    (Note bien le ';' à la fin)
    à placer au début de la boucle.

    'if ... ;' est ici un "modificateur d'instruction", c'est à dire qu'il modifie l'instruction qui précède (ici 'next') pour qu'elle ne s'exécute que si la condition est vrai. Mais il y a aussi d'autre modificateur d'instruction comme 'while ... ;' ou 'foreach ...;'.
    'next' est une instruction qui permet de sauter directement à l'itération suivante de la boucle dans lequel il se trouve. Je pense que tu comprends maintenant comment cet idiome fonctionne.

    On pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while( ){
      if( not m/^$ ){
        # code normal de la boucle
      }
    }
    Mais c'est inélégant, on utilise un bloc (donc une portée syntaxique) de plus (et ceci n'est pas gratuit, donc autant éviter).
    On préfère donc le joli petit idiome présenté ci-dessus.

    --
    Jedaï

  16. #36
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Impecable rspect Mr. Jedai,
    et je te remercie pour ta pedagogie car c'est vraiment bien explique il est vrai que j'avais essayé sansa le pt virgule et ben ca plantait !!! Donc encore merci.
    J espere que je respecte la deontologie du forum en essayant de chercher avant de demander la reponse toute cuite !!!

    Jules

  17. #37
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Citation Envoyé par calimero642
    Impecable rspect Mr. Jedai,
    et je te remercie pour ta pedagogie car c'est vraiment bien explique il est vrai que j'avais essayé sansa le pt virgule et ben ca plantait !!! Donc encore merci.
    J espere que je respecte la deontologie du forum en essayant de chercher avant de demander la reponse toute cuite !!!

    Jules
    Pas de problème. Juste si tu peux mettre ton thread en résolu en cliquant sur le bouton , ce serait super.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [ Noob - Perl Reseau ] Script perl qui recupere les tables ARP des switches Cisco
    Par oneal42 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 04/09/2007, 11h11
  2. [langage] Script Perl Aide
    Par julfra dans le forum Langage
    Réponses: 7
    Dernier message: 17/05/2004, 09h55
  3. [langage] script perl cmd system
    Par kacedda dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2003, 09h45
  4. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26
  5. Réponses: 2
    Dernier message: 11/07/2002, 08h31

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