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 :

Probleme de boucle a s arracher les cheuveux


Sujet :

Langage Perl

  1. #1
    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 Probleme de boucle a s arracher les cheuveux
    Bonjour a tous,
    Voila je suis pas loin du but mais j'accroche un peu sur un probleme de boucle.
    Voila 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
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #!/usr/bin/perl
                                              #Utilisation du module POSIX pour recuperer l'heure
                                              #car ce module gère les variables d'environnement
    use POSIX qw(strftime);                   #strftime est un sous programme du module POSIX qui retourne des listes
    use strict;
     
    #Variables globales utilisées par le programme
    my $Date;
    my $Heure;
    my $Ligne_Fichier;
    my $Groupe;        #Contient le nom des groupes à chaque passage dans la boucle groupe
    my $Com_Snmp;      #Contient le champ correspondant à la communauté snmp
    my $Nom_Switch;    #Contient le nom d'un switch a la fois
    my $Addr_Ip;       #Contient l'adresse IP correspondant au nom du switch sélectionné
    my $essai;
    my $cpt=0;
     
            $Date = strftime "%a %e %b %Y",localtime; #On place la date $date  %a=jour %e=semaine %b=mois %Y annee
            $Heure = strftime "%H:%M:%S", localtime;  #On place l heure dans la variable $heure
     
    print ("#################################################################\n");
    print ("########### Début du script :",$Date," ",$Heure,"############\n"); # affichage de la date et heure
    print ("#################################################################\n");
     
    # 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 $! ");
    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> )
    {
     next if (($Ligne_Fichier) =~ m/^$/);
     #Cette ligne permet d'omettre toute les lignes vides !!! On ne considere donc que les lignes utiles
       {
            if (($essai)=(($Ligne_Fichier)=~s/\n//g))
            #on fait de notre ficher une simple ligne
            {
                    $cpt++;
     
                            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 le nom du groupe
                            }
    if ( ($Com_Snmp)= (($Ligne_Fichier) =~/\]\t+(.*)/ ))
                            # 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]\n");
                            #       print("\n");
                            }
     
                    print Fichier_Resultat ( "$Groupe;$Com_Snmp;$Nom_Switch;$Addr_Ip;\n");
     
             }
       }
    }
    close Fichier_Lan;
    close Fichier_Resultat;

    Voila ce que j'obtient:



    Groupe_Testaaaa;lanxb1;;;
    ;;SXBsw;10.45.11.12;
    ;;SXBsw;10.45.11.13;
    Groupe_Serveurs;lanxb2;;;
    ;;SXB-6;10.45.11.14;
    ;;SXB-5;10.45.11.15;
    ;;SXB-4;10.45.11.16;
    ;;SXB-3;10.45.11.17;
    ;;SXB-2;10.45.11.18;
    ;;SXB-1;10.45.11.19;
    ;;SXB0-1;10.45.11.20;
    ;;SXB-WF10;10.45.11.21;
    ;;SXB-WF9;10.45.11.22;
    ;;SXB-WF8;10.45.11.23;



    Voila ce que je voudrai obtenir



    Groupe_Testaaaa;lanxb1;;SXBsw;10.45.11.12;
    Groupe_Testaaaa;lanxb1;;SXBsw;10.45.11.13;
    Groupe_Serveurs;lanxb2;SXB-6;10.45.11.14;
    Groupe_Serveurs;lanxb2;SXB-5;10.45.11.15;
    Groupe_Serveurs;lanxb2;SXB-4;10.45.11.16;
    Groupe_Serveurs;lanxb2;SXB-3;10.45.11.17;
    Groupe_Serveurs;lanxb2;SXB-2;10.45.11.18;
    Groupe_Serveurs;lanxb2;SXB-1;10.45.11.19;
    Groupe_Serveurs;lanxb2;SXB0-1;10.45.11.20;
    Groupe_Serveurs;lanxb2;SXB-WF10;10.45.11.21;
    Groupe_Serveurs;lanxb2;SXB-WF9;10.45.11.22;
    Groupe_Serveurs;lanxb2;SXB-WF8;10.45.11.23;


    SVP de l aide je suis sur que je ne suis pas loin du but !!!
    merci Jules

  2. #2
    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
    Oups voila mon fichier de depart

    [Groupe_Testaaaa] lanxb

    SXBsw 10.45.11.12
    SXBsw 10.45.11.13

    [Groupe_Serveurs] lanxb

    SXB-6 10.45.11.14
    SXB-5 10.45.11.15
    SXB-4 10.45.11.16
    SXB-3 10.45.11.17
    SXB-2 10.45.11.18
    SXB-1 10.45.11.19
    SXB0-1 10.45.11.20
    SXB-WF10 10.45.11.21
    SXB-WF9 10.45.11.22
    SXB-WF8 10.45.11.23


    Jules

  3. #3
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    j'ai ca à te proposer :
    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
     
    use strict;
     
    open GRP, "groupes.txt" or die $!."\n";
    my @grps = <GRP>;
    close (GRP);
     
    my %lst;
    my $grp;
    my $i=1;
    foreach (@grps) {
    	chomp;
    	$grp = $_.$i if /\[/;
    	push @{$lst{$grp}}, $_ unless /\[/ | !/\w/;
    	$i++ if /\[/;
    }
     
    foreach my $k (keys %lst) {
    	print "$k => $_\n" foreach @{$lst{$k}};
    }
    @+
    Mr6

  4. #4
    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
    Oki merci je suis entrain d essayer de comprendre le role des fonction et des differentes variables.

    A pluche Jules
    Si j ai une question j'hesiterai pas, merci d avance

  5. #5
    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 bout de code, mais je voudrais un peu d explication sur les ligne qui ne sont pas commentee, je n ai pas tout compris que ce soir le unless l interet de | \w etc ... et la variable $_ on peu la renommer differemment ? etc ..

    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
    #!/usr/bin/perl
     
    use strict; # module pour permettre la portabilite des variables grace à my
     
    #Les variables utilisées
    my @Tab_Groupe; #Tableau avec mes groupes
    my %Liste;      #Tableau associatif
    my $Groupe;     #Variavle qui contient un groupe a la fois
    my $Cpt=1;      #Compteur
    my $K;
    open (DESC_GRP, "base_Lan_perso") or die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
    #On ouvre un fichier en lecture  et son descripteur est DESC_GRP
     
    @Tab_Groupe = <DESC_GRP>;
    #Chaque ligne lue dans DESC_GRP va être placee dans une ligne du tableau @Tab_Groupe
     
    close DESC_GRP;
    #On ferme le flux du fichier ouvert par l'intermediare de son descripteur
     
    foreach  $_ (@Tab_Groupe)
    {#On va parcourir chaque ligne du tableau
     
            chomp;
            #Supprime le dernier caractère d'une chaîne, uniquement s'il s'agit d'une fin de ligne dc le saut de ligne
     
            $Groupe = $_ if /\[/;
            # On place dans $Groupe la ligne que l on concatene avec la valeur du compteur
     
            push @{$Liste{$Groupe}}, $_ unless /\[/ | !/\w/;
            #On place dans $Liste le contenu de la variable $Groupe
     
            $Cpt++ if /\[/;
    }
    foreach $K (keys %Liste) {
       print "$K ; $_\n" foreach @{$Liste{$K}};
    Merci Jules

  6. #6
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Bah le \w revient à dire [a-zA-Z0-9] si je ne me trompe pas. comme je ne savais pas quel caractère trainait dans les lignes vides, je me suis dit que tant qu'il n'y avait rien d'écrit ca ne méritait pas d'être retenu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    push @{$lst{$grp}}, $_ unless /\[/ | !/\w/;
    là en l'occurence, je rajoute l'élément courant de @grps dans ma liste de variables sauf si ma ligne commence par [ (signe d'un Groupe_quelque_chose) ou s'il n'y a pas de caractère alphanumérique.

    La variable $_ correspond à la variable courante, par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach my $key (@list) {
     print "$key";
    }
    est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (@list) {
     print $_;
    }
     
    ou :
    print $_ foreach @list;
     
    ou encore :
    print foreach @list;
    D'autres questions ?

    @+
    Mr6

  7. #7
    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 tu es comme JEDAi tres pedagogue (si ca s'ecrit comme ca) et c'est vraiment agreable.
    Jules et pour le moment j ai plus de question merci encore.

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

Discussions similaires

  1. Probleme de conception Univers BO(résoudre les boucles)
    Par smain_inf dans le forum Designer
    Réponses: 2
    Dernier message: 16/06/2011, 14h09
  2. [C#] Probleme de boucle for et random
    Par Freeman166 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/01/2005, 14h34
  3. Réponses: 2
    Dernier message: 30/08/2004, 14h48
  4. probleme avec "LOAD DATA INFILE" et les b
    Par Koo dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/07/2004, 09h37
  5. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

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