in reply to finding if an ip is in a subnet

@ip = qw\10.0.0.1 10.1.2.3 192.168.12.5 77.75.0.1\; @subnets = qw\10.0.0.0/24 10.1.0.0/16 192.168.0.0/12\; foreach $ip (@ip){ @a = split /\./, $ip; $di = getIp(@a); foreach $subnet (@subnets){ ($a, $b) = getNetwork($subnet); if(($di >= $a) && ($di <= $b)){print "$ip in $subnet\n";} } } sub getIp { return ($_[0]*256*256*256) + ($_[1]*256*256) + ($_[2]*256) + $_[3] +; } sub getNetwork { @a = split(/[\/|\.]/, +shift); return (getIp(@a[0 .. 3]), (getIp(@a[0 .. 3]) + (2 ** (32 - $a[4]) +))); }

Replies are listed 'Best First'.
Re^2: finding if an ip is in a subnet
by Anonymous Monk on Mar 17, 2016 at 12:55 UTC

    This is not working, "(getIp(@a[0 .. 3]) + (2 ** (32 - $a[4])".

    By example 10.3.3.0/30 use 10.3.3.0 to 10.3.3.3 but with your method it will return 10.3.3.0 to 10.3.3.4 because 10.3.3.0 + 2 ** 2 = 10.3.3.4

    you need to add '-1' to this, like "(2 ** (32 - $a[4])) - 1"