| |
---|
| | sub Coalesce { |
---|
| | return &coalesce; |
---|
| | } |
---|
| | |
---|
| | =head2 Subtract |
---|
| | |
---|
| | Title : Subtract |
---|
| | Usage : my $remaining_networks = Subtract(\@list_of_networks,\@networks_to_subtract); |
---|
| | Function : computes the network definitions resulting from subtracting @networks_to_subtract from @list_of_networks |
---|
| | Returns : reference to a sorted list of NetAddr::IP objects representing the remaining networks |
---|
| | Args : reference to a sorted list of NetAddr::IP objects (the list must be sorted! eg. by using Compact) |
---|
| | : reference to a sorted list of NetAddr::IP objects to subtract (the list must be sorted! eg. by using Compact) |
---|
| | |
---|
| | =cut |
---|
| | sub Subtract { |
---|
| | my @add = ref $_[0] eq __PACKAGE__ ? ($_[0]) : @{$_[0]}; |
---|
| | my @sub = @{$_[1]}; |
---|
| | my @ret; |
---|
| | while (@add && @sub) { |
---|
| | if ($sub[0]->contains($add[0])) { |
---|
| | if ($add[0]->within($sub[0])) { |
---|
| | shift @add; |
---|
| | } elsif ($add[0]->contains($sub[0])) { |
---|
| | } elsif ($sub[0]->within($add[0])) { |
---|
| | my ($low,$up) = Exclude(shift @add,shift @sub); |
---|
| | push @ret, @$low; |
---|
| | unshift @add, @$up; |
---|
| | } else { |
---|
| |
---|
| | push @ret, @add; |
---|
| | return \@ret; |
---|
| | } |
---|
| | |
---|
| | =head2 Exclude |
---|
| | |
---|
| | Title : Exclude |
---|
| | Usage : my ($remaining_lower_networks,$remaining_upper_networks) = Exclude($original_network,$network_to_exclude); |
---|
| | Function : computes the network definitions resulting from removing the $network_to_exclude from $original_network. |
---|
| | Returns : two list references containing the sorted network definitions 'below' and 'above' the excluded network |
---|
| | Args : NetAddr::IP object of the original network |
---|
| | : NetAddr::IP object of the network to exclude |
---|
| | |
---|
| | =cut |
---|
| | sub Exclude { |
---|
| | return ([],[]) if $_[0] == $_[1]; |
---|
| | return ([$_[0]],[]) unless $_[1]->within($_[0]); |
---|
| | my @low; |
---|
| |
---|
| | |