Calcul adresse reseau perl

Résolu
Bonjour,

je souhaite calculer, dans un script perl, une adresse reseau a partir de mon adresse ip et de mon masque.

Par exemple, si j'ai comme ip 192.168.10.45 et comme masque 255.255.255.0 j'aimerais recuperer dans une variable mon adresse reseau 192.168.10.0 .

Comme faire ?

Merci pour votre aide
Configuration: Solaris
Firefox 2.0.0.14

9 réponses

  1. Modérateur
    Salut,

    Je n'ai pas testé.

    my $ip=.....;
    my $m=....;
    
    my ($x1,$x2,$x3,$x4)=split /\./,$ip;
    my ($m1,$m2,$m3,$m4) = split /\./,$m;
    
    my $reseau=$x1 & $m1 . "." . $x2 & $m2 . "." . $x3 & $m3 . "." . $x4 & $m4;
    autre version
    my $ip=.....;
    my $m=....;
    
    my @ip=split /\./,$ip;
    my @masque = split /\./,$m;
    
    push @reseau,$ip[$_] & $mask[$_] for 1..4;
    my $reseau=join ".",@reseau;

    0
    1. Je te remercie. La premiere partie fonctionne bien.

      Par contre, il y a un probleme avec le ET logique. Ca ne fonctionne pas.
      Si $x1 = 192 et $m1 = 255, l'operation $x1 & $m1 me renvoie 010

      Comment fait-on un "ET Logique" en perl ??
      0
      1. non plus. J'avais deja essaye... Ca retourne soit 192 pour $x1 && $m1 soit 255 pour $m1 && $x1.

        C'est bizar avec un seul & ca devrait fonctionne...
        0
        1. Modérateur
          Re,

          Affiche plutôt le script ainsi que l'exécution
          N'oublie pas de mettre use strict;use warnings; pour avoir les messages d'erreur/avertissement
          0
          1. Comment fait-on un "ET Logique" en perl ??
            Non, c'est un opérateur 'bit à bit' que tu recherches.
            Et il s'agit bien de &.
            192 & 255 donne 192
            193 & 254 donne 192.
            Si ce n'est pas le cas, tu dois faire une erreur quelque part.
            0
            1. Modérateur
              Re,

              De toute façon c'est l'opérateur bit à bit qui doit être utiliser, je pense aussi pour une erreur de syntaxe quelque part.
              Comme je ne peux pas tester, il sera mieux qu'on vois le script.
              0
              1. Tout à fait !
                Mais la question est: va-t-il donner son code ?
                Mystère ;-)
                0
            2. Modérateur
              Re,

              Ok, j'ai compris pourquoi ça ne marche pas.

              Les octets des adresses sont pris pour des chaînes de caractères.
              Exemple
              lami20j@debian:~/trash/ccm_perl$ perl -e 'print "192" & "255","\n"'
              010
              lami20j@debian:~/trash/ccm_perl$ perl -e 'print 192 & 255,"\n"'
              192
              
              Pourquoi?
              Puisque le point est l'opérateur de concaténation.
              Ce qui fait que 192.168.1.47 deviens une chaine de caractère et l'opérateur & donnera un résultat inattendu.Il suffit de forcer la conversion (j'ai utilise une addition avec zéro).
              Vu le contexte 0+192 sera le nombre 192 et pas la chaîne "192".
              Bref 0+192 ou 0+"192" donnera toujours un nombre tandis que 0.192 ou 0 . "192" c'est une chaine
              Voir en gras.
              #!/usr/bin/perl
              use strict;use warnings;
              
              my @reseau;
              my $ip="192.168.1.47";
              my $m="255.255.255.0";
              
              my @ip=split /\./,$ip;
              my @masque = split /\./,$m;
              
              push @reseau,0+$ip[$_] & $masque[$_] for 0 .. 3;
              my $reseau=join ".",@reseau;
              print "réseau $reseau\n";
              __END__
              lami20j@debian:~/trash/ccm_perl$ perl ccm_address_reseau.pl
              réseau 192.168.1.0
              

              0
              1. Chapeau !
                Quelle belle démonstration !
                Comme on aimerait en avoir plus souvent ;-)
                0
              2. Modérateur
                @loupiusSalut,

                Merci.
                Bonne soirée ;-)
                0
            3. Merci beaucoup a tous les deux !!

              Desole de ne reapparaitre que maintenant mais je n'avais plus d'acces au net.

              Encore merci pour votre aide.

              salut
              0