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 :

mettre contenue d'une commande dans un tableau


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 19
    Points
    19
    Par défaut probleme pour un tableau
    Salut!!
    Voila c'est encore moi, je vais jamais en finir avec mon script!!!J'ai de nouveau un problème je veux mettre le contenue d'une commande dans un tableau mais je n'arrive pas, pourtant j'ai repris un exemple donc je ne comprends pas...

    Ça c'est la commande show arp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
             IP              Mac           Port Age VlanId
     
    X.X.X.X       0011.4355.3f65    13   0     10
    X.X.X.X       000c.297e.48a0   13   5     10
    X.X.X.X       0004.8061.2a2a   13   1     10
    il me faudrait la colonne 0,1,2.

    donc j'ai fais ca en recopiant et en m'adaptant a un sujet que jedai avait repondu

    http://www.developpez.net/forums/d40...witches-cisco/


    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
     
         if (defined $IP)
        {
            my $prompt ='/.*[\$#:>\]\%] *$/'; # etat du prompt
            my @output;
            @output = $telnet_session->cmd(String => "show arp", Prompt => $prompt);
            print ("@output\n"); # la variable contient bien ce que je veux
     
            my $show_arp = "show_arp.txt";
            open my($clean_show), '>', $show_arp
                or die "Impossible d'ouvrir $clean_mac_filename : $!\n";
            foreach ( @output ) {
                chomp;
            if ( m/\d+\.\d+\.\d+\.\d+/ )  # si la ligne contient une adresse IP 
               { 
                   print {$clean_show} join(' ',(split)[0,1,2]); # coupe les colonnes 0,1,2 et les separe par un espace mais le print sert a quoi???
               }                                                                                                               
           }                                                                                                                   
           close $clean_show;  
        }
    donc sa marche presque bien, mais quand il y a plus de 2 lignes dans le résultat "show arp", il me colle la colonne 3 et la colonne 1 de la ligne suivante. Comment faire pour les séparer?

    Pour cette methode c'est OK moi ce que j'aimerais bien c'est ne pas passer par un fichier temporaire mais par des variables normal.

    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
     
        if (defined $IP)
        {
            my $prompt ='/.*[\$#:>\]\%] *$/';
            my @output;
            @output = $telnet_session->cmd(String => "show arp", Prompt => $prompt);
            my @tableau;
            print ("@output\n");
     
    while ( @output )
            {
                chomp;
                if (  m/\d+\.\d+\.\d+\.\d+/ ) # si la ligne contient une adresse IP  
                {
                    push @{$tableau[$.]}, join(' ',(split[0,1,2]));
                }
                else
                {
                    &print_error("Enregistrement des donnees\n");
                    return (1);
                }
               print Dumper @tableau;
            }
    MAIs la j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value in pattern match (m//) at ./script.pl line 268.
    C'est au niveau du IF ( m/\d+\.\d+\.\d+\.\d+/ )... je comprends pas la faute...

    et après comment je peux faire pour comparer la colonne 2 des port, parce que mon but est de trouver 2 ports pareil et de me connecter sur l'IP associée.

    voila
    MERCI

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 19
    Points
    19
    Par défaut
    je crois avoir résolu mes problemes 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
     
     
    if (defined $adressIp)
        {
         	my $prompt ='/.*[\$#:>\]\%] *$/';
            my @output;
            @output = $telnet_session->cmd(String => "show arp", Prompt => $prompt);
     
            my @tableau;
            foreach ( @output ) # parcourt le fichier de sortie @output                                                         
            {
                chomp;  # enleve les blancs en fin de lignes                                                                    
                if  ( /\d+\.\d+\.\d+\.\d+/ )  # si la ligne contient une adresse IP                                             
                {
                    push @tableau, join(' ',(split)[0,1,2]); # coupe colonnes 0,1,2, les separes par un espace vers @tableau    
                }
    	} my $lignne;
            my @tableau_clean;
            my $length = @tableau;
            for (my $i=0; $i< $length; $i++)
            {
                push @{$tableau_clean[$i]}, split(/\s+/, $tableau[$i]);
            }
     
            my ($ip,$mac,$port);
            my $nb_ligne = @tableau_clean;
            for (my $y=0; $y< $nb_ligne; $y++)
            {
                $ip = $tableau_clean[$y]->[0];
                $mac  = $tableau_clean[$y]->[1];
                $port = $tableau_clean[$y]->[2];
            print ("$ip,$mac,$port\n");
    	}
    maintenant comment faire pour comparer l'adresse IP qui met donnée en argument, et la comparer a celle qui sont donc les " $ip = $tableau_clean[$y]->[0];"?? et une fois trouver prendre son port "$port = $tableau_clean[$y]->[2];"??

    Merci

  3. #3
    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
    maintenant comment faire pour comparer l'adresse IP qui met donnée en argument, et la comparer a celle qui sont donc les " $ip = $tableau_clean[$y]->[0];"?? et une fois trouver prendre son port "$port = $tableau_clean[$y]->[2];"??




    Si j'ai bein compris, tu as donc un IP dont tu voudrais retrouver l'index ($y) dans la liste @tableau_clean? J'avais pensé à la fonction first_index_BLOCK_LIST afin d'essayer de retrouver $y sans devoir parcourir tout ton tableau mais je ne suis pas certaine que ce soit utilisable dans ton cas étant donné que tu as un array de array.

    En attendant de trouver mieux, tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for my $y (0..$#tableau_clean){
            if ($tableau_clean[$y]->[0] eq $IP){
                 my $pore = $tableau_clean[$y]->[2];
     
                 # suite des opérations
     
                 last;
            }
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 19
    Points
    19
    Par défaut
    salut jasmine!


    moi j'avais fais ca j'ai pas mal avancer

    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
        my $search_port;
        my ($ip,$mac,$port);
        my $nb_ligne = @tableau_clean;
        my $adIP;
        for (my $y=0; $y< $nb_ligne; $y++)  # Boucle pour parcourir la totalite du tableau
    @tableau_clean                       
        {
            $ip = $tableau_clean[$y]->[0];  # Initialise $ip sur chaque ligne du tableau @tableau_clean avec la 1valeur
            $mac  = $tableau_clean[$y]->[1];  # Initialise $mac sur chaque ligne du tableau @tableau_clean avec la 2valeur 
            $port = $tableau_clean[$y]->[2];  # Initialise $port sur chaque ligne du tableau @tableau_clean avec la 3valeur
            print ("$ip,$mac,$port\n");
     
            if ( $adressIp eq $ip )  # si IP entre au debut est = a une ip du tableau alors  
            {
                $search_port = $port;  # sauvegarde du numero de port
                print ("$search_port\n");
            }
        }
     
     for  (my $y=0; $y< $nb_ligne; $y++)
        {
            $ip = $tableau_clean[$y]->[0];
            $mac  = $tableau_clean[$y]->[1];
            $port = $tableau_clean[$y]->[2];
     
            if ( $search_port eq $port )  # Si port == port alors     
            {
                if ( $ip ne $adressIp )  # si l'ip  !=  n'est pas egale a l'adresse ip du debut alors 
                {
                    $adIP = $ip;  # sauvegarder l'adresse IP 
                    print "$adIP\n";
                }
            }
        }
     my $lign;
        my ($switch_name,$switch_ip,$user_login,$user_password);
        my $taille = @switchs_database;
    #    print ("$taille\n");                                                                                                   
        foreach $lign (1 .. $taille)
        {
            $switch_name = $switchs_database[$lign]->[0];
            $switch_ip  = $switchs_database[$lign]->[1];
            $user_login = $switchs_database[$lign]->[2];
            $user_password = $switchs_database[$lign]->[3];
     
            if ( $switch_ip eq $adIP ) ##############################    PAR CONTE LA CA NE MARCHE PAS, c'est le $switch_ip qui deconne mais je sais pas comment faire pour prendre la ligne de connexion pour la bonne @IP.
         {
                &search($switch_name,$switch_ip,$user_login,$user_password);
                print ("$switch_name,$switch_ip,$user_login,$user_password\n");
                return $switch_ip;
            }
        }
    si tu vois des erreurs corrige moi, sa ne peut etre que benefiques

    Merci

  5. #5
    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
    Quand tu as récupéré ce que tu veux dans ton array, utilise la commande 'last' afin de ne pas continuer son parcours jusqu'à la fin.


    Au lieu de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $nb_ligne = @tableau_clean;
     
    for (my $y=0; $y< $nb_ligne; $y++)    
    {
    Tu peux directement faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (my $y=0; $y<@tableau_clean; $y++)              
    {
    J'ai du mal à comprendre pourquoi parcours-tu deux fois ton tableau.
    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
        for (my $y=0; $y< $nb_ligne; $y++)  # Boucle pour parcourir la totalite du tableau @tableau_clean                       
        {
            $ip = $tableau_clean[$y]->[0];  # Initialise $ip sur chaque ligne du tableau @tableau_clean avec la 1valeur
            $mac  = $tableau_clean[$y]->[1];  # Initialise $mac sur chaque ligne du tableau @tableau_clean avec la 2valeur 
            $port = $tableau_clean[$y]->[2];  # Initialise $port sur chaque ligne du tableau @tableau_clean avec la 3valeur
            print ("$ip,$mac,$port\n");
     
            if ( $adressIp eq $ip )  # si IP entre au debut est = a une ip du tableau alors  
            {
                $search_port = $port;  # sauvegarde du numero de port
                print ("$search_port\n");
                last; # on quitte la boucle
            }
        }
     
        for  (my $y=0; $y< $nb_ligne; $y++)
        {
            $ip = $tableau_clean[$y]->[0];
            $mac  = $tableau_clean[$y]->[1];
            $port = $tableau_clean[$y]->[2];
     
            if ( $search_port eq $port )  # Si port == port alors     
            {
                if ( $ip ne $adressIp )  # si l'ip  !=  n'est pas egale a l'adresse ip du debut alors 
                {
                    $adIP = $ip;  # sauvegarder l'adresse IP 
                    print "$adIP\n";
                }
            }
        }
    première boucle : on récupère le port correspondant à l'ip $adressIp.
    deuxième boucle : on recherche toutes les autres ip possédant ce même port.

    Est-ce bien cela?

  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
    Je n'y connais rien en réseau, j'ai donc pris des valeurs au hasard.

    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
    #!/usr/local/bin/perl
     
     
     
    use strict;
    use warnings;
     
     
    my $adressIp = '130.245263.78';
     
    my @tableau_clean = (
    	['130.245263.78', 'mac 1', '356'],
    	['126.34363.78', 'mac 2', '352'],
    	['132.8863.78', 'mac 2', '356'],
    );
     
     
    # recherche de port correspondant à l'adresseIp de référence ($adressIp)
    my ($array_ref) = grep {${$_}[0] eq $adressIp} @tableau_clean;
    my $search_port = ${$array_ref}[2];
     
     
    # tableau qui contiendra toutes les adresses IP ayant le même port ($search_port)
    # que l'IP de référence ($adressIp)
    my @all_ip;
     
     
    # parcours du tableau
    for (my $y=0; $y<@tableau_clean; $y++){
    		# si le port correspond
    		if(${$tableau_clean[$y]}[2] eq $search_port){
    		# on récupère l'IP correspondant
    		push (@all_ip, ${$tableau_clean[$y]}[0]);
    	}
    }
     
     
    # affichage de la liste de ports
    map {print "$_\n";} @all_ip;

    Résultat : récupération de l'ip 132.8863.78 qui a le même port que 130.245263.78
    130.245263.78
    132.8863.78

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 19
    Points
    19
    Par défaut
    bonjour Jasmine j'espere sava aujourd'hui?!

    donc pour commencer j'ai modifier mon code sur les parcours de tableau avec le maximum dans le premier post de ce matin!

    mais pour ce qui suit je comprends pas tout!
    Ma solution est pas la plus optimiser c'est pour sa que tu me donnes une autre solutions??? ou parce que la mienne ne marchera pas tout le temps?


    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
    !/usr/local/bin/perl
     
     
     
    use strict;
    use warnings;
     
    
    my $adressIp = '130.245263.78';
     
    my @tableau_clean = (
    	['130.245263.78', 'mac 1', '356'],
    	['126.34363.78', 'mac 2', '352'],
    	['132.8863.78', 'mac 2', '356'],
    );
     
     
    # recherche de port correspondant à l'adresseIp de référence ($adressIp)
    my ($array_ref) = grep {${$_}[0] eq $adressIp} @tableau_clean; # grep(expression, tableau) c'est sa t'utilise?
    my $search_port = ${$array_ref}[2];
     
     
    # tableau qui contiendra toutes les adresses IP ayant le même port ($search_port)
    # que l'IP de référence ($adressIp)
    my @all_ip;
     
     
    # parcours du tableau
    for (my $y=0; $y<@tableau_clean; $y++){
    		# si le port correspond
    		if(${$tableau_clean[$y]}[2] eq $search_port){
    		# on récupère l'IP correspondant
    		push (@all_ip, ${$tableau_clean[$y]}[0]);
    	}
    }
     
     
    # affichage de la liste de ports
    map {print "$_\n";} @all_ip;
    EN GRAS : ce que je comprends pas
    ITALIQUE : ce que je comprends!

    faut surtout tu m'explique ce passage la STP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my ($array_ref) = grep {${$_}[0] eq $adressIp} @tableau_clean; # grep(expression, tableau) c'est sa t'utilise?
    my $search_port = ${$array_ref}[2];
    La variable array_ref contient quoi?? l'adresse IP qui est la meme que $adressIp

    je comprends pas pourquoi tu mais ${$tableau_clean[$y]}[2]
    pourquoi le $ devant???
    ET au lieu d'utiliser les ${$tableau_clean[$y]}[2], je peux utiliser les variable que j'initialise? pour ${$tableau_clean[$y]}[2] = $port, je peux utiliser $port???

    MERCI BCP

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 19
    Points
    19
    Par défaut
    UP!!

    Jasmine si tu es là!! je veux bien t'es explications!!

    MERCI

  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
    Ma solution est pas la plus optimiser c'est pour sa que tu me donnes une autre solutions??? ou parce que la mienne ne marchera pas tout le temps?
    Ta façon de faire fonctionne bien mais tu parcours deux fois la totalité de ton tableau via une boucle foreach ce qui n'est pas du tout optimisé ... utilise au moins un 'last' afin de quitter cette boucle une fois ton port trouvé dans la première boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # recherche de port correspondant à l'adresseIp de référence ($adressIp)
    my ($array_ref) = grep {${$_}[0] eq $adressIp} @tableau_clean; # grep(expression, tableau) c'est sa t'utilise?
    my $search_port = ${$array_ref}[2];
    Cette partie de code utilise les références.

    On a un array de array. Je ne sais pas comment les qualifier mais disons un array primaire contenant une série d'array secondaires.
    On doit parcourir l'array principal afin de trouver l'array secondaire dans lequel l'ip équivaut à $adressIp. On sait également que l'index dans l'array secondaire de l'ip est 0. On veut retrouver le port correspondant dans cet array secondaire. Ce qui nous faut donc, c'est l'index primaire auquel correspond cet array secondaire dans l'array primaire.
    ... j'essaie d'être claire, j'espère que tu me suis.

    Reprenons mon petit tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @tableau_clean = (
    	['130.245263.78', 'mac 1', '356'],
    	['126.34363.78', 'mac 2', '352'],
    	['132.8863.78', 'mac 2', '356'],
    );
    On recherche l'ip 130.245263.78 ($adressIp) dont l'index secondaire connu est 0 et dont l'index primaire recherché est 0 (car premier array secondaire dans l'array principal).
    Sommes nous maintenant sur la même longueur d'ondes?

    utilisation d'une référence
    Si on recherche une valeur dans l'array secondaire, on utilise donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $val_array_secondaire = ${ref_array_primaire}[index_secondaire];
    my $ip = ${$tableau_clean[$y]}[0];
    Ce que l'on veut donc est $tableau_clean[$y].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($array_ref) = grep {${$_}[0] eq $adressIp} @tableau_clean;
    grep va donc récupérer dans @tableau_clean cette référence via ($_) et la stocker dans $array_ref. Une fois que nous avons cette référence de l'array secondaire, il est facile de retrouver dans celle-ci la valeur du port dont on sait que l'index secondaire est 2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $search_port = ${$array_ref}[2];


    N'hésite pas à poser d'autres questions sur ce qui reste obscure.

Discussions similaires

  1. Mettre le contenu d'une variable dans un tableau
    Par clement106 dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2010, 20h48
  2. [MySQL] Insérer le contenu d'une table dans un tableau
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/01/2008, 08h37
  3. Réponses: 13
    Dernier message: 18/05/2007, 16h06
  4. Réponses: 3
    Dernier message: 12/07/2006, 14h54
  5. [MySQL] Lister le contenu d'une table dans un tableau HTML
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 03/04/2006, 19h40

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