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 :

[langage] Compter des éléments dans un tableau


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut [langage] Compter des éléments dans un tableau
    Bonjour,

    Voila, j'aimerais pouvoir récupérer à l'aide de 2fichiers quel port possède +sieurs adresses mac (c'est un trunk), quel port à 1seul adresse mac, et quel port n'a aucune adresse.

    Pour cela mes 2 fichiers sont :

    0002.b9b0.5a80 Gi0/2
    0002.b9b0.5ab2 Gi0/2
    0008.e380.bced Gi0/1
    000b.fd42.4c7f Gi0/1
    000a.e602.ce92 Fa0/7
    000b.fdd5.c07f Gi0/1
    0008.e380.bced Gi0/1
    000d.5622.5841 Fa0/20
    .....
    et
    Fa0/1
    Fa0/2
    Fa0/3
    Fa0/4
    Fa0/5
    Fa0/6
    Fa0/7
    Fa0/8
    ......
    ......
    Gi0/1
    Gi0/2
    Voila un petit bout de code, tout en sachant que je suis débutante en perl.
    Il ne fonctionne pas comme je voudrais évidemment.
    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/bin/perl -w 
     
    use strict; 
    use CGI;   
     
    open ( FichierIP,"../liste_des_adresses2b.txt") || die "\n impossible d'ouvrir le fichier nommé liste _des_adresses2b.txt $! \n\n" ; 
     
    open ( FichierPort,"../10.131.31.1b.txt") || die "\n impossible d'ouvrir le fichier nommé 10.131.31.1b.txt $! \n\n" ;
     
    open ( FichierInterface,"../interface2.txt") || die "\n impossible d'ouvrir le fichier nommé interface2.txt $! \n\n" ;
     
    # On affiche l'en-tête HTML
    print("content-type : text/html\n\n");
     
    my %Nb;
     
    while&#40; <FichierPort> &#41; &#123;
    	# on supprime le retour chariot de la fin de la ligne
    	chomp;
    	#on sépare les adresses Mac des ports
    	my @LIGNES_FichPort = split;
    	my $mac2 = $LIGNES_FichPort&#91;0&#93; ; 
            my $port = $LIGNES_FichPort&#91;1&#93; ;
            my $i;
    	$mac2 =~ tr/.//d; 
            $Nb&#123;$port&#125;++;
            my @Port = keys &#40;%Nb&#41;;
     
            print "@Port \n";
            #foreach $i&#40;@Port&#41;&#123;
           #   print "$Nb&#123;$i&#125; \n";
            #&#125;
     
    print "</body></html>";
     
    close &#40;FichierIP&#41;;
    close &#40;FichierPort&#41;;
    close &#40;FichierInterface&#41;;
    En fait, j'aimerais pour l'instant compter le nombre d'adresse qui passe par le port gi0/1, fa0/1, fa0/2..., et ensuite afficher par mon 2ème fichier que le port gi0/1 par exemple est trunk (car +sieur adresse), le fa0/7 a 1seule adresse, et fa0/10 par exemple n'a pas d'adresse.

    j'espère que vous m'avez comprise.

    Merci pour votre aide.

  2. #2
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Si j'ai bien compris, tu voudrais compter le nombre de valeurs de ton hachage pour une clé donnée ?

    Si oui, il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach my $i &#40;keys %Nb&#41;
    &#123;
       my $nbreAdresses = scalar&#40;@Nb&#123;$i&#125;&#41;;
       # etc.
    &#125;
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Il est possible de profiter de l'identifiant unique que représente le numéro de port pour indexer une table de hachage ...

    On peut construire ce hachage en y logeant des tableaux d'adresses MAC (attention, petite difficulté si l'on est pas familier des références et du fait qu'un tableau de tableau est en fait un tableau de références à des tableaux).

    On ajoute ensuite les clef provenant de la liste des ports, en prenant bien soin de ne pas leur donner de valeur.

    Enfin, on n'a plus qu'a parcourir le hachage pour chaque clef :
    - valeur associée à la clef indéfinie : le port est inoccupé
    - valeur associée = tableau à 1 élément : port occupé
    - valeur associée = tableau à n>1 élément : port trunk.

    Ca peut donner quelque chose comme ça (code fonctionnel et commenté mais pas forcément optimal, loin de là) :
    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
    #!/bin/perl
     
    use warnings;
    use strict;
     
    # Traitement du fichier qui donne le port pour chaque MAC
    open &#40;MAC,"./adresses.txt"&#41; || die "\n impossible d'ouvrir le fichier des adresses \n\n" ;
    # On prépare une table de hachage ... notre clef sera l'identifiant du port.
    my %correspondances=&#40;&#41;;
    while &#40;<MAC>&#41; &#123;
      # Pour chaque ligne, coupure du saut et séparation entre MAC et Port
      chomp;
      my &#40;$mac, $port&#41; = split;
      # Connait on déjà ce port ?
      if &#40;exists &#40;$correspondances&#123;$port&#125;&#41;&#41; &#123;
        # Oui ... on ajoute la mac au tableau stocké dans le hachage pour ce port donné
        # C'est un peu compliqué, dans le hachage, on n'a pas réellement des tableaux, mais des références
        # &#40;comprendre 'pointeurs', ça correspond presque&#41;
        my $ref=$correspondances&#123;$port&#125;;
        push @$ref, $mac;
      &#125; else &#123;
        # Non, alors on crée le tableau &#40;référence anonyme pour les connaisseurs&#41;
        # Et on le met dans le hachage.
        $correspondances&#123;$port&#125; = &#91; $mac &#93;;
      &#125;
    &#125;
    close &#40; MAC&#41;;
     
    # Traitement de la liste de ports, à présent.
    open &#40;Ports,"./ports.txt"&#41; || die "\n impossible d'ouvrir le fichier des ports \n\n" ;
    while &#40;<Ports>&#41; &#123;
      chomp;
      # Connait on déjà ce port ?
      if &#40;not exists &#40;$correspondances&#123;$_&#125;&#41;&#41; &#123;
        # Non ... on l'ajoute au hachage mais sans valeur associée
        $correspondances&#123;$_&#125; = undef;
      &#125;
    &#125;
    close &#40; Ports&#41;;
     
    # Petite ruse pour afficher tout le contenu d'un tableau en un seul print
    $,=", ";
     
    # Pour tous les ports &#40;nos clefs de %correspondances&#41; triés
    foreach &#40;sort &#40;keys&#40;%correspondances&#41;&#41;&#41; &#123;
      # L'élement a t'il une valeur associée &#40;est-il défini&#41; ?
      if &#40;not defined &#40;$correspondances&#123;$_&#125;&#41;&#41; &#123;
        # Non -> Port sans connexion
        print "$_ n'a pas d'adresses MAC connectée\n";
      &#125; else &#123;
        # Oui -> Connexions, mais combien ?
        my $ref=$correspondances&#123;$_&#125;;
        if &#40;scalar &#40;@$ref&#41; == 1&#41; &#123;
          # Une seule
          print "$_ n'a qu'une machine &#58; $ref->&#91;0&#93;\n";
          # Plusieurs
        &#125; else &#123;
          print "$_ est un trunk &#58; ";
          print @$ref;
          print "\n";
        &#125;
      &#125;
    &#125;
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    wouha!!!On voit que vous êtes des pros!!!
    Je me galère pour 3lignes et vous, ça coule de source.
    Faut que je relise le code pour bien comprendre mais il me semble que vous avez bien cerné mon objectif.
    C'est durdur de commencer le perl.
    En tout cas merci beaucoup pour votre aide.

  5. #5
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par helene22500
    wouha!!!On voit que vous êtes des pros!!!
    Tu vas me faire rougir

    Et pourtant, je ne considère pas ce code comme idéal ... mais je n'avais pas le temps ni l'énergie de faire mieux ... plus tard, peut-être.

    Citation Envoyé par helene22500
    Je me galère pour 3lignes et vous, ça coule de source.
    Le code, ça coule de source, c'est normal

    La facilité apparente est le plus souvent le fruit d'un travail masqué

    Rapidement, en Perl, on prend des automatismes et des habitudes (bonnes ou pas, c'est un autre débat), et ça fait très vite avancer les choses.

    Citation Envoyé par helene22500
    Faut que je relise le code pour bien comprendre mais
    La grosse difficulté est dans le fait de faire un hachage de tableaux (de références, en fait). C'est, pour le débutant en programmation ou en Perl l'élément le plus délicat à appréhender ... Pour le reste, j'espère l'avoir suffisamment commenté pour qu'on comprenne ce qu'il doit faire, à défaut de comprendre ce qu'il fait.

    Citation Envoyé par helene22500
    il me semble que vous avez bien cerné mon objectif.
    Si c'est le cas, c'est souvent la moitié du boulot de fait ...

    En outre, avec Perl, il est parfois plus efficace de raisonner sur les données, que de raisonner sur leur traitement (trouver la clef de hachage qui sera pertinente pour notre problème, utiliser des hachages plutot que des tableaux, faire la distinction (sémantique) entre un élément inexistant, ou existant sans valeur, etc.)

    Citation Envoyé par helene22500
    C'est durdur de commencer le perl.
    Rassure toi, on en est tous passés par là.

    Personnellement, je n'ai réussi à m'accrocher efficacement au langage qu'au 3e ou 4e essai. Mais maintenant, je suis conquis.

    Et puis la FAQ spéciale Developpez.com est sur les rails ... elle devrait arriver en gare sous peu 8)

    Bonne continuation.

    Enjoy the Perl Powahhhhhh !
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Tout d'abord merci à toi 2Eurocents, pour ton aide, tes explications, et surtout ton soutient.

    Je pense avoir bien compris ton code (merci pour le détail des commentaires que tu as intégré).

    Je l'ai rajouté dans mon petit bout de code et j'ai rajouté quelques petites choses. J'aurais encore besoin de ton aide car il y a quelques bug.

    voila le 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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    #!/usr/bin/perl -w
     
    use warnings; 
    use strict; 
    use CGI;
     
    #Traitement qui donne l'ip pour chaque Mac
    open &#40; FichierIP,"../liste_des_adresses2b.txt"&#41; || die "\n impossible d'ouvrir le fichier nommé liste _des_adresses2b.txt $! \n\n" ; 
     
    my %IP;
     
    while&#40; <FichierIP> &#41; &#123; 
    	# on supprime le retour chariot de la fin de la ligne
    	chomp;
    	#on sépare les adresses Mac des ports
    	my @LIGNES_FichIP = split;
    	my $mac1 = $LIGNES_FichIP&#91;0&#93;;
    	$IP&#123;$mac1&#125; = "$LIGNES_FichIP&#91;1&#93;";
    &#125;
     
    close &#40;FichierIP&#41;;
     
    my @Mac = keys &#40;%IP&#41;;
     
    print "<html><head><title>Correspondance Mac/IP</title></head><body bgcolor='#FFFFCC' text='#663366'>"; 
    print "<h1><u> Voici le tableau des correspondances &#58; </u></h1><br><br><br> \n";
     
     
    # Traitement du fichier qui donne le port pour chaque MAC 
    open &#40; FichierPort_Mac,"../10.131.166.1b.txt"&#41; || die "\n impossible d'ouvrir le fichier nommé 10.131.31.1b.txt $! \n\n" ;
     
    # On prépare une table de hachage ... notre clef sera l'identifiant du port. 
    my %correspondances=&#40;&#41;; 
    while &#40;<FichierPort_Mac>&#41; &#123; 
      # Pour chaque ligne, coupure du saut et séparation entre MAC et Port 
      chomp; 
      my &#40;$mac2, $port&#41; = split; 
      $mac2 =~ tr/.//d; 
      # Connait on déjà ce port ? 
      if &#40;exists &#40;$correspondances&#123;$port&#125;&#41;&#41; &#123; 
        # Oui ... on ajoute la mac au tableau stocké dans le hachage pour ce port donné 
        # C'est un peu compliqué, dans le hachage, on n'a pas réellement des tableaux, mais des références 
        # &#40;comprendre 'pointeurs', ça correspond presque&#41; 
        my $ref=$correspondances&#123;$port&#125;; 
        push @$ref, $mac2; 
      &#125; else &#123; 
        # Non, alors on crée le tableau &#40;référence anonyme pour les connaisseurs&#41; 
        # Et on le met dans le hachage. 
        $correspondances&#123;$port&#125; = &#91; $mac2 &#93;;
      &#125; 
    &#125; 
    close &#40;FichierPort_Mac&#41;; 
     
    # Traitement de la liste de ports, à présent. 
    open &#40; FichierPort,"../interface2.txt"&#41; || die "\n impossible d'ouvrir le fichier des ports \n\n" ; 
     
    while &#40;<FichierPort>&#41; &#123; 
      chomp; 
      # Connait on déjà ce port ? 
      if &#40;not exists &#40;$correspondances&#123;$_&#125;&#41;&#41; &#123; 
        # Non ... on l'ajoute au hachage mais sans valeur associée 
        $correspondances&#123;$_&#125; = undef; 
      &#125; 
    &#125; 
    close &#40;FichierPort&#41;; 
     
    # Petite ruse pour afficher tout le contenu d'un tableau en un seul print 
    $,=", "; 
     
    # Pour tous les ports &#40;nos clefs de %correspondances&#41; triés 
    foreach &#40;sort &#40;keys&#40;%correspondances&#41;&#41;&#41; &#123; 
      # L'élément a t'il une valeur associée &#40;est-il défini&#41; ? 
      if &#40;not defined &#40;$correspondances&#123;$_&#125;&#41;&#41; &#123; 
        # Non -> Port sans connexion 
        print "$_ n'a pas d'adresses MAC connectés\n"; 
      &#125; else &#123; 
        # Oui -> Connexions, mais combien ? 
        my $ref=$correspondances&#123;$_&#125;; 
        # si une seule 
        if &#40;scalar &#40;@$ref&#41; == 1&#41; &#123; 
          #si les adresses mac du fichier des mac correspond aux mac du fichier des ip
          if &#40;grep&#40;$ref->&#91;0&#93;, @Mac&#41;&#41;&#123;
          #on affiche la correspondance
            print "$_ => $ref->&#91;0&#93; => $IP&#123;$ref->&#91;0&#93;&#125; \n"; 
          #Sinon il n'y a pas de correspondance  
          &#125; else &#123;
             print "$_ => $ref->&#91;0&#93; => n'a pas d'IP correspondante \n";
          &#125;  
        #Si Plusieurs    
        &#125; else &#123; 
        #c'est un lien trunk
          print "$_ est un trunk. "; 
          print "\n"; 
        &#125; 
      &#125; 
    &#125;
    et voila ce que ça donne à l'exécution (enfin c'est juste un petit bout) :
    n'a pas d'adresses MAC connectés
    Use of uninitialized value in concatenation (.) or string at ./trouverPort.cgi line 84.
    Fa0/10 => 0010dc89599c =>
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    Fa0/12 => 000476d9dbc0 => 10.114.11.109
    n'a pas d'adresses MAC connectés
    Fa0/13 => 0000392395b1 => 10.114.11.22
    n'a pas d'adresses MAC connectés
    Fa0/14 => 0011097157b6 => 10.114.11.115
    n'a pas d'adresses MAC connectés
    Fa0/15 => 0050da218420 => 10.114.11.125
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    Use of uninitialized value in concatenation (.) or string at ./trouverPort.cgi line 84.
    Fa0/21 => 00408c594dc0 =>
    n'a pas d'adresses MAC connectés
    n'a pas d'adresses MAC connectés
    Il y a un problème dans mon test de grep car si il n'y a pas de correspondance de mac il devrait me mettre qu'il n'y a pas de correspondance ip. De plus, le port dont l'adresse mac n'est pas connecté n'apparait pas. Je vois pas le truc à modifier pour "$_".

    Voila, si tu pouvais regarder d'où vient le problème.
    Je continue de chercher en attendant.

    Merci.


  7. #7
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Bonjour,

    J'ai regardé rapidement et superficiellement, et n'ai pas réalisé de tests, faute de données (le fichier MAC/IP) ...

    Citation Envoyé par helene22500
    Il y a un problème dans mon test de grep car si il n'y a pas de correspondance de mac il devrait me mettre qu'il n'y a pas de correspondance ip. De plus, le port dont l'adresse mac n'est pas connecté n'apparait pas. Je vois pas le truc à modifier pour "$_".
    J'aurai tendance à considérer le test de grep comme superflu, voire dangereux, comme on travaille directement sur la variable de contexte $_ en plusieurs endroits ... (ce qui n'est pas forcément une bonne habitude, mais qui est quand même d'un confort incroyable lorsque l'on sait de quoi on parle ...). De même, le tableau @Mac me parait inutile, de prime abord.

    Je m'explique :
    Le tableau @Mac est rempli avec les clefs de %IP. C'est valable si l'on doit effectuer des traitements totalement disjoints de ceux de %IP. Cependant, si l'objet est de vérifier l'existence/validité d'une Mac, autant ne pas faire un grep dans un tableau issu de ces clefs, mais faire directement un exists sur le hachage.

    Donc, sans avoir testé, faute de données, j'aurais tendance à ré-écrire le test if avec le grep comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          if &#40;exists &#40;$IP&#123;$ref->&#91;0&#93;&#125;&#41;&#41;&#123;
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    J'ai remplacé mon grep par ton if exists et en effet c'est mieux et mon tableau @Mac est bel et bien superflu.
    Je n'ai pas encore les bons réflexes!
    Sinon, j'ai un autre petit souci. La boucle while (<FichierPort>) me permet de récupérer les ports que je ne connais pas et de les mettre dans le hachage sans leur associer de valeur et ensuite dans le foreach je les affiche avec n'a pas d'adresse Mac. Mais à l'exécution cela me donne ça :
    Fa0/1 n'a pas d'adresses MAC connectés Fa0/10 n'a pas d'adresses MAC connectés Fa0/11 => 0010dc9a5128 => 172.20.26.225

    Fa0/11 n'a pas d'adresses MAC connectés Fa0/12 n'a pas d'adresses MAC connectés Fa0/13 n'a pas d'adresses MAC connectés Fa0/14 n'a pas d'adresses MAC connectés Fa0/15 => 0020edad1bb9 => 172.20.27.29

    Fa0/15 n'a pas d'adresses MAC connectés Fa0/16 n'a pas d'adresses MAC connectés Fa0/17 n'a pas d'adresses MAC connectés Fa0/18 n'a pas d'adresses MAC connectés Fa0/19 n'a pas d'adresses MAC connectés Fa0/2 n'a pas d'adresses MAC connectés Fa0/20 => 000d56225841 => 172.20.22.55

    Fa0/20 n'a pas d'adresses MAC connectés Fa0/21 n'a pas d'adresses MAC connectés Fa0/22 n'a pas d'adresses MAC connectés Fa0/23 n'a pas d'adresses MAC connectés Fa0/24 n'a pas d'adresses MAC connectés Fa0/25 n'a pas d'adresses MAC connectés Fa0/26 n'a pas d'adresses MAC connectés Fa0/27 n'a pas d'adresses MAC connectés Fa0/28 n'a pas d'adresses MAC connectés Fa0/29 n'a pas d'adresses MAC connectés Fa0/3 n'a pas d'adresses MAC connectés Fa0/30 n'a pas d'adresses MAC connectés Fa0/31 n'a pas d'adresses MAC connectés Fa0/32 n'a pas d'adresses MAC connectés Fa0/33 n'a pas d'adresses MAC connectés Fa0/34 n'a pas d'adresses MAC connectés Fa0/35 n'a pas d'adresses MAC connectés Fa0/36 => 0020edad2a05 => n'a pas d'IP correspondante

    Fa0/36 n'a pas d'adresses MAC connectés Fa0/37 n'a pas d'adresses MAC connectés Fa0/38 n'a pas d'adresses MAC connectés Fa0/39 n'a pas d'adresses MAC connectés Fa0/4 => 0020edad29bc => 172.20.25.2

    Fa0/4 n'a pas d'adresses MAC connectés Fa0/40 n'a pas d'adresses MAC connectés Fa0/41 n'a pas d'adresses MAC connectés Fa0/42 n'a pas d'adresses MAC connectés Fa0/43 n'a pas d'adresses MAC connectés Fa0/44 n'a pas d'adresses MAC connectés Fa0/45 n'a pas d'adresses MAC connectés Fa0/46 n'a pas d'adresses MAC connectés Fa0/47 n'a pas d'adresses MAC connectés Fa0/48 n'a pas d'adresses MAC connectés Fa0/5 n'a pas d'adresses MAC connectés Fa0/6 n'a pas d'adresses MAC connectés Fa0/7 => 000ae602ce92 => 172.20.23.84

    Fa0/7 n'a pas d'adresses MAC connectés Fa0/8 n'a pas d'adresses MAC connectés Fa0/9 n'a pas d'adresses MAC connectés Gi0/1 est un trunk.

    Gi0/1 n'a pas d'adresses MAC connectés Gi0/2 est un trunk.

    Gi0/2 n'a pas d'adresses MAC connectés
    En fait, tout les ports apparaissent avec n'a pas d'adresses Mac.

    Je te donne un bout du fichier "fichier mac/ip" :
    001109a579c2 10.111.1.10
    0090274e3e4e 10.111.1.13
    00110973bd47 10.111.1.19
    000d5e788958 10.111.1.24
    000ae6052ae6 10.111.1.27
    001109a579d0 10.111.1.31
    0030f1244fbc 10.111.1.36
    000b5d7c8a8a 10.111.1.40
    000c76fcbaf8 10.111.1.5
    000b5d49b004 10.111.1.56
    001109b91ddc 10.111.11.10
    0030f161fdfc 10.111.11.12
    0011099f4dff 10.111.11.14
    0030f1244f14 10.111.11.17
    000ae604e86d 10.111.11.18
    000ae6047cb5 10.111.11.3
    000d5e7886e6 10.111.11.4
    000c76a4d047 10.111.11.6
    00306e269d33 10.112.1.1
    000c76874580 10.112.1.12
    000ae603418a 10.112.1.13
    000ae6047bf5 10.112.1.14
    0030f168235a 10.112.1.15
    0030f145b45f 10.112.1.16
    000ae6048123 10.112.1.17
    00004c9ec712 10.112.1.18
    000ae604e7c7 10.112.1.19
    0010dc47559b 10.112.1.2
    0030f1244f69 10.112.1.24
    000ae601a61a 10.112.1.25
    0030f1244f84 10.112.1.27
    000ae60210f1 10.112.1.28
    00003971c139 10.112.1.29
    000ae605a074 10.112.1.32
    000c76c3f33f 10.112.1.36
    0030f1244835 10.112.1.40
    000c76c3f2e3 10.112.1.5
    0010dc53546f 10.112.1.6
    0030f1244aa1 10.112.1.7
    000475769f3b 10.112.1.9
    000d5ea415c4 10.112.11.1
    0004757f7af6 10.112.11.10
    000c76c3f2db 10.112.11.11
    000d5e78782a 10.112.11.15
    0004758323d4 10.112.11.3
    000ae602d2f9 10.112.11.5
    0004768ba604 10.113.1.1
    000ae601f476 10.113.1.100
    000ae6016914 10.113.1.102
    00047595171a 10.113.1.103
    0090270c461a 10.113.1.104
    000ae603742e 10.113.1.106
    000255f91cbf 10.113.1.108
    000ae602f330 10.113.1.109
    000ae602eaaf 10.113.1.11
    000c76649999 10.113.1.110
    0004768ba091 10.113.1.111
    000b5d48e1ed 10.113.1.112
    000a5e04e370 10.113.1.113
    000a5e04e068 10.113.1.114
    00306e26bcf1 10.113.1.115
    000475d19b1b 10.113.1.116
    000ae603017c 10.113.1.118
    000ae6060ff7 10.113.1.12
    en espérant qu'il y ait des adresses mac correspondante dedans (vu kil n'est pas entier).

    Merci encore pour ton aide.

  9. #9
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Je ne veux pas dire de bétise, car j'ai juste survolé l'affaire, mais je pense que ça vient de la combinaison initialisation/test que tu utilises pour le fichier de ports.

    Initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $correspondances&#123;$_&#125; = undef;
    Test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if &#40;not defined &#40;$correspondances&#123;$_&#125;&#41;&#41; &#123;


    Bon.
    J'ai pas le temps de tester alors ce qui suit est à prendre avec des pincettes ; mais tu peux tester de changer l'initialisation comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $correspondances&#123;$_&#125; = '';
    De sorte que le test du "not defined" le trouve définit, mais que le if exists ne te sorte rien.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  10. #10
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Moi, je n'ai pas encore eu le temps de creuser le problème, mais je voulais juste commenter ceci :

    Citation Envoyé par Gamdwin
    J'ai pas le temps de tester alors ce qui suit est à prendre avec des pincettes ; mais tu peux tester de changer l'initialisation comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $correspondances&#123;$_&#125; = '';
    De sorte que le test du "not defined" le trouve définit, mais que le if exists ne te sorte rien.
    C'est à éviter. Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $correspondances&#123;$_&#125; = undef;
    est bel et bien voulu. C'est pour avoir un élément existant, mais de valeur indéfinie.

    Lors du test, dans la boucle, il est inutile de faire un test préalable d'existence, avant de faire un test de définition. En effet, nous sommes dans un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach &#40;keys &#40;%correspondance&#41;&#41;
    , donc $_ correspond exclusivement à des éléments existants.

    Voila.

    Plus de précision sur ton problème, helene22500, dès que j'ai un peu de temps libre.

    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  11. #11
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Lors du test, dans la boucle, il est inutile de faire un test préalable d'existence, avant de faire un test de définition. En effet, nous sommes dans un
    Code:
    foreach (keys (%correspondance))
    , donc $_ correspond exclusivement à des éléments existants.



    En effet, j'ai écrit une bétise.

    Bon. J'ai essayé d'y voir clair dans les différents fichiers utilisés, mais j'ai du mal. Apparemment le très long serait FichierPort ?
    Les autres ressemblent à quoi ?
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Encore merci pour votre aide à tous les deux.

    Gamdwin, mes fichiers sont dans l'odre en partant du début de la discussion en haut :
    - 1er fichier est "FichierPort_Mac"
    - 2ème fichier est "FichierPort"
    - 3ème fichier est "FichierIP".

    Je pensais aussi que c'étais le undef, mais il est clair que j'en ai besoin.

    Voila, bon j'y retourne.


  13. #13
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Alors j'ai testé chez moi, avec les exemples donnés, et j'ai comparé avec :

    Sinon, j'ai un autre petit souci. La boucle while (<FichierPort>) me permet de récupérer les ports que je ne connais pas et de les mettre dans le hachage sans leur associer de valeur et ensuite dans le foreach je les affiche avec n'a pas d'adresse Mac. Mais à l'exécution cela me donne ça
    Et je ne vois pas le problème.
    A l'exécution, on a bien (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fa0/1 n'a pas d'adresses MAC connectés
    Et quand il y a une connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fa0/20 => 000d56225841 => n'a pas d'IP correspondante
    Ce qui est conforme à ce qu'on attend... ?


    EDIT : par contre je remplacerais les "\n" de tes affichages par des "<br>", parce que si en mode console ça passe, en HTML ça va tout mettre à la suite.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci pour le truc du "\n", je vais les enlever.

    Ben en fait chez moi ça fonctionne pas car à l'exécution ça me sort le fichier que tu peux lire plus haut dans une citation (6 réponses au-dessus).
    Tous les port ont "n'a pas d'adresse" + ceux qui ont 1adresse où il y a la correspondance. En fait c'est ça le problème.
    Je ne devrais qu'avoir les port qui n'ont pas d'adresse mac avec ce message.
    Bon, je sais si je suis claire, si tu comprend pas, dis-le moi, j'essaierai de m'expliquer autrement.

  15. #15
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    EDIT : a y est, j'ai remis en forme et j'ai compris :

    Fa0/1 n'a pas d'adresses MAC connectés
    Fa0/10 n'a pas d'adresses MAC connectés
    Fa0/11 => 0010dc9a5128 => 172.20.26.225
    Fa0/11 n'a pas d'adresses MAC connectés

    Fa0/12 n'a pas d'adresses MAC connectés
    ...
    Je suis parvenu à reproduire ce comportement en triturant les fichiers exemples, je pense avoir trouvé d'où ça vient.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  16. #16
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Voilà, j'ai fini mes tests.

    Je pense qu'on a un souci d'espaces qui trainent dans les chaînes de caractères, qu'il faut nettoyer.
    En fait, on génère des clefs en apparence différentes, qui n'auraient pas dû l'être.

    Par exemple, on peut avoir la clef "Fa0/20" qui cohabite avec la clef "Fa0/20<espace>".
    C'est génant, mais ça se règle facilement.

    Essaie avec cette modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach &#40;<FichierPort>&#41; 
    &#123;
      chomp;
      s/ //g;
     
      # Connait on déjà ce port ?
       <...>
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  17. #17
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Désolé Gamdwin, j'ai effectué ta modif mais malheureusement, j'ai toujours le même problème.
    Cela sert donc à enlever les espace superflu, si j'ai bien compris?

    attend, voila l'exécution que ça me donne en plus propre :

    Fa0/1 n'a pas d'adresses MAC connectés

    Fa0/10 n'a pas d'adresses MAC connectés

    Fa0/11 => 0010dc9a5128 => 172.20.26.225

    Fa0/11 n'a pas d'adresses MAC connectés

    Fa0/12 n'a pas d'adresses MAC connectés

    Fa0/13 n'a pas d'adresses MAC connectés

    Fa0/14 n'a pas d'adresses MAC connectés

    Fa0/15 => 0020edad1bb9 => 172.20.27.29

    Fa0/15 n'a pas d'adresses MAC connectés

    Fa0/16 n'a pas d'adresses MAC connectés

    Fa0/17 n'a pas d'adresses MAC connectés
    .......
    .......
    Fa0/8 n'a pas d'adresses MAC connectés

    Fa0/9 n'a pas d'adresses MAC connectés

    Gi0/1 est un trunk.

    Gi0/1 n'a pas d'adresses MAC connectés

    Gi0/2 est un trunk.

    Gi0/2 n'a pas d'adresses MAC connectés

  18. #18
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Essaie de faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Clef &#58; #$_#<br>\n";
    Tout au début de ta dernière boucle.

    Le but est de contrôler pourquoi on a des doublons de clef, les '#' nous aideront à trouver les éventuels espaces.
    Je pense qu'il faudra également supprimer les espaces de $port, dans le second "while" du script.



    Sinon, pour "s/ //d", c'est l'équivalent de "tr/ //d".
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  19. #19
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Voila ce que cela me donne :

    - sur la page html :

    Fa0/1 n'a pas d'adresses MAC connectés

    Fa0/10 n'a pas d'adresses MAC connectés

    Clef : #Fa0/11#
    Fa0/11 => 0010dc9a5128 => 172.20.26.225

    Fa0/11 n'a pas d'adresses MAC connectés

    Fa0/12 n'a pas d'adresses MAC connectés

    Fa0/13 n'a pas d'adresses MAC connectés

    Fa0/14 n'a pas d'adresses MAC connectés

    Clef : #Fa0/15#
    Fa0/15 => 0020edad1bb9 => 172.20.27.29

    Fa0/15 n'a pas d'adresses MAC connectés

    Fa0/16 n'a pas d'adresses MAC connectés

    Fa0/17 n'a pas d'adresses MAC connectés
    .......

    - en ligne de commande :

    <html><head><title>Correspondance Mac/IP</title></head><body bgcolor='#FFFFCC' text='#663366'><h1><u> Voici le tableau des correspondances : </u></h1><br><br>
    n'a pas d'adresses MAC connectés <br><br>Clef : #Fa0/11#<br>
    n'a pas d'adresses MAC connectés <br><br>Clef : #Fa0/15#<br>
    n'a pas d'adresses MAC connectés <br><br>Clef : #Fa0/20#<br>
    n'a pas d'adresses MAC connectés <br><br>Clef : #Fa0/36#<br>
    n'a pas d'adresses MAC connectés <br><br>Clef : #Fa0/4#<br>r>Fa0/36
    n'a pas d'adresses MAC connectés <br><br>Clef : #Fa0/7#<br>
    n'a pas d'adresses MAC connectés <br><br>Clef : #Gi0/1#<br>
    Gi0/1 est un trunk. <br><br>
    n'a pas d'adresses MAC connectés <br><br>Clef : #Gi0/2#<br>
    Gi0/2 est un trunk. <br><br>

  20. #20
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Bon.
    J'ai zieuté les différents cas possibles, et je n'arrive à reproduire le doublon QUE s'il y a des espaces dans le fichier des ports, ET s'il n'y a pas d'instruction pour virer ces espaces superflus.

    Avec ma modif. qui consiste à ajouter "s/ //g" dans la boucle "foreach (<FichierPort>)", je n'arrive plus à reproduire l'erreur. Du coup, comme chez moi je n'ai pas de problème, je ne peux pas t'aider à le résoudre.

    Peut-être qu'il y a un cas de figure que je n'ai pas vu, mais je ne sais pas lequel.


    Juste pour info, avec les exemples que tu nous as fourni dans ce thread, j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <html><head><title>Correspondance Mac/IP</title></head><body bgcolor='#FFFFCC' text='#663366'><h1><u> Voici le tableau des correspondances &#58; </u></h1><br><br><br> 
    Fa0/1 n'a pas d'adresses MAC connectés
    Fa0/2 n'a pas d'adresses MAC connectés
    Fa0/20 => 000d56225841 => n'a pas d'IP correspondante 
    Fa0/3 n'a pas d'adresses MAC connectés
    Fa0/4 n'a pas d'adresses MAC connectés
    Fa0/5 n'a pas d'adresses MAC connectés
    Fa0/6 n'a pas d'adresses MAC connectés
    Fa0/7 => 000ae602ce92 => n'a pas d'IP correspondante 
    Fa0/8 n'a pas d'adresses MAC connectés
    Gi0/1 est un trunk. 
    Gi0/2 est un trunk.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/10/2013, 16h40
  2. Centrer des images et du texte dans un tableau
    Par hstlaurent dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 30/08/2005, 17h34
  3. [langage] Compter des chaines de caractères
    Par julfra dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2004, 18h42
  4. [langage] compter des caracteres dans une chaine
    Par louisis dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 23h39
  5. Réponses: 4
    Dernier message: 24/04/2003, 23h28

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