Página 1 de 1

Módulo para direcciones IP

NotaPublicado: 2014-11-30 15:12 @675
por juanse_rojas
Hola, la verdad que soy nuevo programando en Perl, ahora estoy haciendo una pequeña aplicación para mi asignatura de programación en Perl que me configure un enrutador.

Anduve buscando algún módulo que permita sumar a una IP valores ejemplo: 10.0.0.1 sumarle 1 y que quede 10.0.0.2 o restarle 1 y quede 10.0.0.0.

Se los agradezco de antemano :D

Re: Módulo para direcciones IP

NotaPublicado: 2014-11-30 17:07 @755
por explorer
He entrado en MetaCPAN y he buscado por "IP" y "Math", y me han salido, entre otros, Net::IP y Net::IPAddress::Util.

Re: Módulo para direcciones IP

NotaPublicado: 2014-12-03 13:09 @589
por dansamp
Hola, he creado este script.

Ojo, al sumar 1.0.0.255 +1 da resultado 1.0.0.256 (!!)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Data::Dumper;
  5.  
  6. sub ip_calculator($$){
  7.         my $ip          = shift;
  8.         my $operation   = shift;
  9.         # control operation
  10.         return -1 if $operation !~ m/\d/;
  11.         return -1 if $operation =~ m/[a-zA-Z]/;
  12.         return -1 if $operation !~ m/^\+\d+$/ and
  13.                      $operation !~ m/^-\d+$/  and
  14.                      $operation !~ m/\d+$/;
  15.         # At this point operation is ok
  16.  
  17.         my $type_operation=()?"rest":"add";
  18.         my @octetos = split(/\./,$ip);
  19.  
  20.         ($operation =~ m/^-/) ? &rest($operation,@octetos) : &add($operation,@octetos);
  21.  
  22.         # this can be done using functional programing
  23.         sub add($){
  24.                 my $value = shift;
  25.                 my @octetos = @_;
  26.                 $value =~ s/\+//;
  27.                 return($octetos[0] . "." . $octetos[1] . "." . $octetos[2] . "." . ($octetos[3]+$value));
  28.         }
  29.         sub rest($){
  30.                 my $value = shift;
  31.                 my @octetos = @_;
  32.                 $value =~ s/\-//;
  33.                 return($octetos[0] . "." . $octetos[1] . "." . $octetos[2] . "." . ($octetos[3]-$value));
  34.         }
  35. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Crea una carpeta llamada tests; copia y ejecuta estos tests.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Test::More 'no_plan';
  5. use lib '../';
  6. use ip_calculator;
  7. ok(&ip_calculator("10.0.0.1","d") eq "-1","operation has NO numbers");
  8. ok(&ip_calculator("10.0.0.1","d1") eq "-1","control of operation 1d");
  9. ok(&ip_calculator("10.0.0.1","") eq "-1","control of operation empty");
  10. # print &ip_calculator("10.0.0.1","1")."\n";
  11. isnt(&ip_calculator("10.0.0.1","1"),"-1","1 vALID add operation");
  12. isnt(&ip_calculator("10.0.0.1","+1"),"-1","+1 vALID add operation");
  13. isnt(&ip_calculator("10.0.0.1","1"),"-1","-1 A vALID rest operation");
  14. ok(&ip_calculator("10.0.0.1","+1") eq "10.0.0.2","sumarle 1 a 10.0.0.1 da 10.0.0.2");
  15. ok(&ip_calculator("10.0.0.1","+100") eq "10.0.0.101","sumarle 1 a 10.0.0.1 da 10.0.0.2");
  16. # print &ip_calculator("10.0.0.1","+1");
  17. ok(&ip_calculator("10.0.0.1","-1") eq "10.0.0.0","Restarle 1 a 10.0.0.1 da 10.0.0.0");
  18. ok(&ip_calculator("10.0.0.101","-100") eq "10.0.0.1","Restarle 100 a 10.0.0.101 da 10.0.0.1");
  19.  
  20. ok(&ip_calculator("10.0.0.255","1") eq "10.0.0.256","ESTO NO DEBERÍA SER ASÍ");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Un placer estar por estos foros.