@sorted = sort { ($$a[0] <=> $$b[0]) or ($$a[1] <=> $$b[1]) or ($$a[2] <=> $$b[2]) or ($$a[3] <=> $$b[3]) } map { /(\d+)[.](\d+)[.](\d+)[.](\d+)/; [$1, $2, $3, $4] } @ip; my $previous = []; my @range = (); for $current (@sorted, [260, 0, 0, 0]) { if (greaterbyone($previous,$current) { $$previous[4] = $$current[3]; } else { push @range, $previous; $previous = $current; }