Net-Subnet
view release on metacpan or search on metacpan
lib/Net/Subnet.pm view on Meta::CPAN
}
sub cidr2mask_v6 {
my ($length) = @_;
return pack('B128', '1' x $length);
}
sub subnet_matcher {
@_ > 1 and goto &multi_matcher;
my ($net, $mask) = split m[/], shift;
return $net =~ /:/
? ipv6_matcher($net, $mask)
: ipv4_matcher($net, $mask);
}
sub ipv4_matcher {
my ($net, $mask) = @_;
$net = inet_aton($net);
$mask = $mask =~ /\./ ? inet_aton($mask) : cidr2mask_v4($mask);
lib/Net/Subnet.pm view on Meta::CPAN
return sub {
$_->[MATCHER]->($_[0]) and return $_->[SUBNET]
for $_[0] =~ /:/ ? @v6 : @v4;
return undef;
}
}
sub sort_subnets {
my @unsorted;
for (@_) {
my ($net, $mask) = split m[/];
$mask = $net =~ /:/
? ($mask =~ /:/ ? inet_pton(AF_INET6, $mask) : cidr2mask_v6($mask))
: ($mask =~ /\./ ? inet_aton($mask) : cidr2mask_v4($mask));
$net = $net =~ /:/
? inet_pton(AF_INET6, $net)
: inet_aton($net);
push @unsorted, sprintf "%-16s%-16s%s", ($net & $mask), $mask, $_;
( run in 1.183 second using v1.01-cache-2.11-cpan-71847e10f99 )