in reply to checking ip ranges

can anyone see any flaws with my code? it works but is it solid?

You have a precedence problem in this code:

($t[0] == $s[0] && $t[0] == $e[0]) ? $r[0] = 1 : $r[0] = 0; ($t[1] == $s[1] && $t[1] == $e[1]) ? $r[1] = 1 : $r[1] = 0; ($t[2] == $s[2] && $t[2] == $e[2]) ? $r[2] = 1 : $r[2] = 0; ($t[3] == $s[3] && $t[3] == $e[3]) ? $r[3] = 1 : $r[3] = 0;

The  = operator has higher precedence than the  ?: operator.    That should be written as:

$r[0] = $t[0] == $s[0] && $t[0] == $e[0] ? 1 : 0; $r[1] = $t[1] == $s[1] && $t[1] == $e[1] ? 1 : 0; $r[2] = $t[2] == $s[2] && $t[2] == $e[2] ? 1 : 0; $r[3] = $t[3] == $s[3] && $t[3] == $e[3] ? 1 : 0;

However it would be better to use the Socket module that is installed with Perl:

use Socket; sub cmp_ips { my $t = inet_aton( $_[0] ) or do { warn "$_[0] is not a valid IP a +ddress.\n"; return 0 }; my $s = inet_aton( $_[1] ) or do { warn "$_[1] is not a valid IP a +ddress.\n"; return 0 }; my $e = inet_aton( $_[2] ) or do { warn "$_[2] is not a valid IP a +ddress.\n"; return 0 }; return 1 if $t eq $s && $t eq $e; return 1 if $t ge $s && $t le $e && ( $t ne $s || $t ne $e ); return 0; }

Replies are listed 'Best First'.
Re^2: checking ip ranges
by arcnon (Monk) on Mar 13, 2008 at 20:45 UTC
    not to get off topic but your saying
    ($t[0] == $s[0] && $t[0] == $e[0]) ? $r[0] = 1 : $r[0] = 0;
    isn't the same as
    if ($t[0] == $s[0] && $t[0] == $e[0]){ $r[0] = 1; } else{ $r[0] = 0; }
    right?

      No it isn't:

      $ perl -MO=Deparse,-p -e ' ($t[0] == $s[0] && $t[0] == $e[0]) ? $r[0] += 1 : $r[0] = 0; ' (((($t[0] == $s[0]) && ($t[0] == $e[0])) ? ($r[0] = 1) : $r[0]) = 0); -e syntax OK $ perl -MO=Deparse,-p -e ' $r[0] = ($t[0] == $s[0] && $t[0] == $e[0]) +? 1 : 0; ' ($r[0] = ((($t[0] == $s[0]) && ($t[0] == $e[0])) ? 1 : 0)); -e syntax OK

      Update: for example:

      $ perl -le' @test = ( [ 10, 12, 14 ], [ 12, 12, 14 ], [ 12, 14, 14 ], [ 12, 12, 12 + ], [ 14, 10, 14 ] ); for ( @test ) { ( $t, $s, $e ) = @$_; print "1: $t $s $e"; $r = undef; ($t == $s && $t == $e) ? $r = 1 : $r = 0; print "2: $t $s $e $r"; $r = undef; $r = ($t == $s && $t == $e) ? 1 : 0; print "3: $t $s $e $r\n"; } ' 1: 10 12 14 2: 10 12 14 0 3: 10 12 14 0 1: 12 12 14 2: 12 12 14 0 3: 12 12 14 0 1: 12 14 14 2: 12 14 14 0 3: 12 14 14 0 1: 12 12 12 2: 12 12 12 0 3: 12 12 12 1 1: 14 10 14 2: 14 10 14 0 3: 14 10 14 0