NAME
Net::IP::Lite - Perl extension for manipulating IPv4/IPv6 addresses
SYNOPSIS
use
Net::IP::Lite;
ip2bin(
'127.0.0.1'
) .
"\n"
;
ip_validate(
'127.0.0.1'
) .
"\n"
;
ip_is_ipv4(
'127.0.0.1'
) .
"\n"
;
ip_is_ipv6(
'::1'
) .
"\n"
;
ip_is_ipv6ipv4(
'::ffff:7f00:1'
) .
"\n"
;
ip_transform(
'127.0.0.1'
, {
convert_to
=>
'ipv6ipv4'
,
short_ipv6
=> 1 }
) .
"\n"
;
ip_equal(
'0x7f000001'
,
'127.0.0.1'
) .
"\n"
;
ip_equal_v4(
'0x7f000001'
,
'::ffff:127.0.0.1'
) .
"\n"
;
ip_equal_v6(
'0x7f000001'
,
'::ffff:127.0.0.1'
) .
"\n"
;
ip_in_range(
'127.0.0.1'
,
'127.0.0.1/8'
) .
"\n"
;
ip_in_range(
'127.0.0.1'
, [
'127.0.0.1/8'
,
'10.0.0.0 255.255.255.255'
]) .
"\n"
;
my
$ip
= Net::IP::Lite->new(
'127.0.0.1'
) ||
die
'Invalid IP address'
;
$ip
->binary .
"\n"
;
$ip
->address .
"\n"
;
$ip
->is_ipv4(
'127.0.0.1'
) .
"\n"
;
$ip
->is_ipv6(
'::1'
) .
"\n"
;
$ip
->is_ipv6ipv4(
'::ffff:7f00:1'
) .
"\n"
;
$ip
->transform({
convert_to
=>
'ipv6ipv4'
,
short_ipv6
=> 1
}) .
"\n"
;
$ip
->equal(
'0x7f000001'
,
'127.0.0.1'
) .
"\n"
;
$ip
->equal(
'0x7f000001'
, Net::IP::Lite->new(
'127.1'
)) .
"\n"
;
$ip
->equal_v4(
'0x7f000001'
,
'::ffff:127.0.0.1'
) .
"\n"
;
$ip
->equal_v6(
'0x7f000001'
,
'::ffff:127.0.0.1'
) .
"\n"
;
$ip
->in_range(
'127.0.0.1'
,
'127.0.0.1/8'
) .
"\n"
;
$ip
->in_range(
'127.0.0.1'
, [
'127.0.0.1/8'
,
'10.0.0.0 255.0.0.0'
,
Net::IP::Lite::Net->new(
'10.0.0.0/8'
)
]) .
"\n"
;
my
$net
= Net::IP::Lite::Net->new(
'10.0.0.0/8'
) ||
die
...;
$net
->address() .
"\n"
;
$net
->mask->address() .
"\n"
;
$net
->contains(
'10.1.1.1'
) .
"\n"
;
DESCRIPTION
This is another module to manipulate IPv4/IPv6 addresses. In contrast of NET::IP, it does not require Math::BigInt. Also, it supports some additional IPv4 formats like 0x7f000001, 2130706433, 017700000001, 0177.0.0.1, 0x7f.0.0.0x1.
The module provides the following capabilities:
validating IP addresses;
converting IP addresses in different format;
comparing IP addresses;
verifying whether an IP is an IPv4 or an IPv6 or an IPv4-embedded IPv6 address;
verifying whether an IP is in a range.
Most subroutines have two implementations, so you can use procedural or object-oriented approach.
SUPPORTED FORMATS
You can use any IPv4 and IPv6 formats:
127.0.0.1, 127.0.1, 127.1 (IPv4 with decimal octets);
0177.0.0.1, 0177.0.1, 0177.1 (IPv4 with octal octets);
0x7f.0x0.0x0.0x1, 0x7f.0x0.0x1, 0x7f.0x1 (IPv4 with hexadecimal octets);
0177.0.0.1, 0x7f.0.1, 0177.0x1 (IPv4 with mixed octets);
2130706433 (decimal IPv4);
0x7f000001 (hexadecimal IPv4);
017700000001 (octal IPv4);
0:0:0:0:0:0:0:1, ::, ::1 (IPv6);
0:0:0:0:0:ffff:127.0.0.1, ::ffff:127.0.0.1 (IPv4-embedded IPv6 address).
PROCEDURAL INTERFACE
ip2bin
Returns a string that contains binary representation of an IP address. Returns the empty string if an invalid IP address is specified.
$ip
= ip2bin(
'127.0.0.1'
);
# '01111111000000000000000000000001'
$ip
= ip2bin(
'::1'
);
# '0' x 127 . '1'
$ip
= ip2bin(
'::1:'
);
# ''
ip_validate
Returns TRUE if the specified IP address is a valid, or FALSE otherwise.
$ok
= ip_validate(
'127.0.0.1'
);
# TRUE
$ok
= ip_validate(
'::1'
);
# TRUE
$ok
= ip_validate(
'127.0.0.'
);
# FALSE
$ok
= ip_validate(
'127.256'
);
# FALSE
$ok
= ip_validate(
'::1:127.0.0.1'
);
# FALSE
ip_is_ipv4
Returns TRUE if the specified IP address is an IPv4 address, or FALSE otherwise.
$ok
= ip_is_ipv4(
'127.0.0.1'
);
# TRUE
$ok
= ip_is_ipv4(
'::1'
);
# FALSE
$ok
= ip_is_ipv4(
'0::0:'
);
# FALSE
$ok
= ip_is_ipv4(
'::ffff:127.0.0.1'
);
# FALSE
ip_is_ipv6
Returns TRUE if the specified IP address is an IPv6 address, or FALSE otherwise.
$ok
= ip_is_ipv6(
'::1'
);
# TRUE
$ok
= ip_is_ipv6(
'::ffff:127.0.0.1'
);
# TRUE
$ok
= ip_is_ipv6(
'0::0:'
);
# FALSE
$ok
= ip_is_ipv6(
'0::0:ffff1'
);
# FALSE
$ok
= ip_is_ipv6(
'127.0.0.1'
);
# FALSE
ip_is_ipv6ipv4
Returns TRUE if the specified IP address is an IPv4-embedded IPv6 address, or FALSE otherwise.
$ok
= ip_is_ipv6ipv4(
'::ffff:127.0.0.1'
);
# TRUE
$ok
= ip_is_ipv6ipv4(
'::ffff:7f00:1'
);
# TRUE
$ok
= ip_is_ipv6ipv4(
'::fff1:7f00:1'
);
# FALSE
$ok
= ip_is_ipv6ipv4(
'127.0.0.1'
);
# FALSE
ip_transform
Converts an IP address string to another IP address string (or number).
$ip
= ip_transform(
$ip
,
$opts
);
Where $opts is a hash that can have the following keys:
short_ipv6 => 1 (return abbreviated IPv6 address);
short_ipv4 => 1 (return abbreviated IPv4 address);
lead_zeros => 1 (add leading zeros to IPv6 address or hexadecimal IPv4 address);
reverse => 1 (return reversed IP address);
convert_to => 'ipv6' (transform IPv4 to IPv6 address);
convert_to => 'ipv4' (transform IPv6-embedded address to IPv4);
convert_to => 'ipv6ipv4' (transform IP address to format ::ffff:xx.xx.xx.xx);
format_ipv4 => 'X' (transform IPv4 address to hexadecimal number);
format_ipv4 => 'D' (transform IPv4 address to decimal number);
format_ipv4 => 'O' (transform IPv4 address to octal number);
format_ipv4 => 'x' (transform IPv4 address to hexadecimal octet format);
format_ipv4 => 'o' (transform IPv4 address to octal number).
$ip
= ip_transform(
'127.0.1'
);
# 127.0.0.1
$ip
= ip_transform(
'::1'
);
# 0:0:0:0:0:0:0:1
$ip
= ip_transform(
'::ffff:127.0.0.1'
);
# 0:0:0:0:0:ffff:7f00:1
$ip
= ip_transform(
'127.0.0.1'
, {
short_ipv4
=> 1
});
# 127.1
$ip
= ip_transform(
'0:0::1'
, {
short_ipv6
=> 1
});
# ::1
$ip
= ip_transform(
'0:0::1'
, {
lead_zeros
=> 1
});
# 0000:0000:0000:0000:0000:0000:0000:0001
$ip
= ip_transform(
'0:0::1'
, {
short_ipv6
=> 1,
lead_zeros
=> 1
});
# ::0001
$ip
= ip_transform(
'0:0::1'
, {
reverse
=> 1
});
# 1:0:0:0:0:0:0:0
$ip
= ip_transform(
'::ffff:127.0.0.1'
, {
reverse
=> 1,
short_ipv6
=> 1
});
# 1:7f00:ffff::
$ip
= ip_transform(
'127.0.0.1'
, {
convert_to
=>
'ipv6'
});
# 0:0:0:0:0:ffff:7f00:1
$ip
= ip_transform(
'::ffff:127.0.0.1'
, {
convert_to
=>
'ipv6'
});
# 0:0:0:0:0:ffff:7f00:1
$ip
= ip_transform(
'::ffff:7f00:1'
, {
convert_to
=>
'ipv4'
});
# 127.0.0.1
$ip
= ip_transform(
'::ffff:127.0.0.1'
, {
convert_to
=>
'ipv4'
});
# 127.0.0.1
$ip
= ip_transform(
'::ffff:7f00:1'
, {
convert_to
=>
'ipv6ipv4'
});
# 0:0:0:0:0:ffff:127.0.0.1
$ip
= ip_transform(
'::ffff:127.0.0.1'
, {
convert_to
=>
'ipv6ipv4'
});
# 0:0:0:0:0:ffff:127.0.0.1
$ip
= ip_transform(
'127.0.0.1'
, {
convert_to
=>
'ipv6ipv4'
});
# 0:0:0:0:0:ffff:127.0.0.1
$ip
= ip_transform(
'0.0.0.1'
, {
format_ipv4
=>
'X'
});
# 0x1
$ip
= ip_transform(
'0.0.0.1'
, {
format_ipv4
=>
'X'
,
lead_zeros
=> 1
});
# 0x00000001
$ip
= ip_transform(
'127.0.0.1'
, {
format_ipv4
=>
'D'
});
# 2130706433
$ip
= ip_transform(
'127.0.0.1'
, {
format_ipv4
=>
'O'
});
# 017700000001
$ip
= ip_transform(
'127.0.0.1'
, {
format_ipv4
=>
'x'
});
# 0x7f.0x0.0x0.0x1
$ip
= ip_transform(
'127.0.0.1'
, {
format_ipv4
=>
'x'
,
short_ipv4
=> 1
});
# 0x7f.0x1
$ip
= ip_transform(
'127.0.0.1'
, {
format_ipv4
=>
'x'
,
lead_zeros
=> 1 });
# 0x7f.0x00.0x00.0x01'
$ip
= ip_transform(
'127.0.0.1'
, {
format_ipv4
=>
'o'
});
# 0177.0.0.01
ip_equal
Compares two IP addresses.
$eq
= ip_equal(
'127.0.0.1'
,
'0x7f000001'
);
# TRUE
$eq
= ip_equal(
'::'
,
'0:0:0:0:0:0:0:0'
);
# TRUE
$eq
= ip_equal(
'::ffff:127.0.0.1'
,
'127.0.0.1'
);
# FALSE
ip_equal_v4
Compares two IP addresses as IPv4 addresses.
$eq
= ip_equal_v4(
'127.0.0.1'
,
'0x7f000001'
);
# TRUE
$eq
= ip_equal_v4(
'::ffff:127.0.0.1'
,
'127.0.0.1'
);
# TRUE
$eq
= ip_equal_v4(
'::'
,
'127.0.0.1'
);
# dies
ip_equal_v6
Compares two IP addresses as IPv6 addresses.
$eq
= ip_equal_v6(
'127.0.0.1'
,
'0x7f000001'
);
# TRUE
$eq
= ip_equal_v6(
'::1'
,
'0:0::1'
);
# TRUE
$eq
= ip_equal_v6(
'::ffff:127.0.0.1'
,
'127.0.0.1'
);
# TRUE
$eq
= ip_equal_v6(
'::'
,
'127.0.0.1'
);
# FALSE
ip_in_range
Verifies whether the specified IP address in a range.
$in_range
= ip_in_range(
'127.0.0.1'
,
$range
);
Where range can be specified in the following ways:
an IP address and a mask ('192.168.0.1 255.255.255.0');
an IP address with a prefix ('ffff:ffff:1::/48');
an IP address without mask ('129.168.0.1' (equivalent to '192.168.0.1/32'));
as an array ([ '129.168.0.0/16', '172.16.0.0/12', '10.0.0.0 255.0.0.0', '::ffff/96' ]);
$in
= ip_in_range(
'192.168.0.1'
,
'192.168.0 255.255.255.0'
);
# TRUE
$in
= ip_in_range(
'10.10.10.19'
, [
'127.1'
,
'10.0/8'
]);
# TRUE
$in
= ip_in_range(
'10.10.10.19'
,
'10.10.10.8/29'
);
# FALSE
$in
= ip_in_range(
'a0:a0:a0:a0:1::1'
,
'a0:a0:a0:a0::/64'
);
# TRUE
$in
= ip_in_range(
'::ffff:10.10.10.10'
,
'::ffff:0:0/96'
);
# TRUE
$in
= ip_in_range(
'1:2:3::8000:40'
,
'1:2:3::8000:20/123'
);
# FALSE
EXPORTS
Net::IP::Lite exports the following functions:
ip2bin
ip_validate
ip_is_ipv4
ip_is_ipv6
ip_is_ipv6ipv4
ip_transform
ip_equal
ip_equal_v4
ip_equal_v6
ip_in_range
OBJECT-ORIENTED INTERFACE
When you use the object oriented approach, binary representation of IP address is calculated once (when you create Net::SimpleIO object). Thus, if you are going to use an IP address (or a range) more than once, you can use once created object to reduce redundant IP-to-binary conversions.
Net::IP::Lite object
constructor
$ip
= Net::IP::Lite->new(
'10.77.0.77'
) ||
die
'Invalid IP address'
;
$ip
= Net::IP::Lite->new(
'::1'
) ||
die
...
address
Returns the original IP address that was specified as the constructor argument.
$ip
= Net::IP::Lite->new(
'10.77.77'
);
$ip
->address();
# 10.77.77
binary
Returns a string that contains binary representation of the specified IP address.
$ip
= Net::IP::Lite->new(
'10.77.77'
);
$ip
->binary();
# 00001010010011010000000001001101
is_ipv4
Returns TRUE if the IP address is a IPv4 address, or FALSE otherwise.
$ip
= Net::IP::Lite->new(
'10.77.77'
);
$ipv4
=
$ip
->is_ipv4();
# TRUE
$ip
= Net::IP::Lite->new(
'::1'
);
$ipv4
=
$ip
->is_ipv4();
# FALSE
See also: "ip_is_ipv4"
is_ipv6
Returns TRUE if the IP address is a IPv6 address, or FALSE otherwise.
$ip
= Net::IP::Lite->new(
'::1'
);
$ipv6
=
$ip
->is_ipv6();
# TRUE
$ip
= Net::IP::Lite->new(
'127.1'
);
$ipv6
=
$ip
->is_ipv6();
# FALSE
See also: "ip_is_ipv6"
is_ipv6ipv4
Returns TRUE if the IP address is a IPv4-Embedded IPv6 address, or FALSE otherwise.
$ip
= Net::IP::Lite->new(
'::ffff:127.0.0.1'
);
$emb
=
$ip
->is_ipv6ipv4();
# TRUE
$ip
= Net::IP::Lite->new(
'::ffff:7f00:1'
);
$emb
=
$ip
->is_ipv6ipv4();
# TRUE
$ip
= Net::IP::Lite->new(
'::1'
);
$emb
=
$ip
->is_ipv6ipv4();
# FALSE
$ip
= Net::IP::Lite->new(
'127.1'
);
$emb
=
$ip
->is_ipv6ipv4();
# FALSE
See also: "ip_is_ipv6ipv4"
transform
Converts the IP address to an IP address string (or number).
$ip
= Net::IP::Lite->new(
'0:0:0:0:0:0:0:1'
);
$ip
->transform({
short_ipv6
=> 1 });
# ::1
See "ip_transform" for all possible values of $opts.
equal
Compares two IP addresses.
$ip
= Net::IP::Lite->new(
'0:0:0:0:0:0:0:1'
);
$eq
=
$ip
->equal(
'::1'
);
# TRUE
$eq
=
$ip
->equal(
'::2'
);
# FALSE
$ip1
= Net::IP::Lite->new(
'0:0:0:0:0:0:0:1'
);
$ip2
= Net::IP::Lite->new(
'::1'
);
$eq
=
$ip
->equal(
$ip2
);
# TRUE
See also: "ip_equal"
equal_v4
Compares two IP addresses as IPv4 addresses.
$ip
= Net::IP::Lite->new(
'::ffff:127.0.0.1'
);
$eq
=
$ip
->equal_v4(
'127.0.0.1'
);
# TRUE
$ip1
= Net::IP::Lite->new(
'::ffff:7f00:1'
);
$ip2
= Net::IP::Lite->new(
'127.0.0.1'
);
$eq
=
$ip
->equal_v4(
$ip2
);
# TRUE
$ip
= Net::IP::Lite->new(
'::7f00:1'
);
$eq
=
$ip
->equal_v4(
'127.0.0.1'
);
# dies
See also: "ip_equal_v4"
equal_v6
Compares two IP addresses as IPv6 addresses.
$ip
= Net::IP::Lite->new(
'::ffff:127.0.0.1'
);
$eq
=
$ip
->equal_v6(
'127.0.0.1'
);
# TRUE
$ip1
= Net::IP::Lite->new(
'::ffff:7f00:1'
);
$ip2
= Net::IP::Lite->new(
'127.0.0.1'
);
$eq
=
$ip
->equal_v6(
$ip2
);
# TRUE
See also: "ip_equal_v6"
in_range
Verifies whether the IP in a range.
$ip
= Net::IP::Lite->new(
'10.10.10.10'
);
$in
=
$ip
->in_range(
'10.10.10.8/29'
);
# TRUE
$in
=
$ip
->in_range([
'192.168.0 255.255.255.0'
,
'10.0/8'
]);
# TRUE
See also: "ip_in_range"
Apart from string IP addresses you specify Net::IP::Lite::Net object:
$ip
= Net::IP::Lite->new(
'10.10.10.10'
);
$net
= Net::IP::Lite::Net->new(
'10.0/8'
) ||
die
...;
$in
=
$ip
->in_range(
$net
);
# TRUE
$net
= Net::IP::Lite::Net->new(
'1::/16'
) ||
die
...;
$in
=
$ip
->in_range(
$net
);
# FALSE
$in
=
$ip
->in_range([
$net
,
'10.0/8'
]);
# TRUE
See also: "Net::IP::Lite::Net object"
Net::IP::Lite::Net object
constructor
The Net::IP::Lite::Net class is a descendant of Net::IP::Lite.
$net
= Net::IP::Lite::Net->new(
'10.0/8'
) ||
die
...;
$net
= Net::IP::Lite::Net->new(
'10.0.0.8 255.255.255.248'
) ||
die
...;
$net
= Net::IP::Lite::Net->new(
'1::/16'
) ||
die
...;
$net
= Net::IP::Lite::Net->new(
'1:: ffff::'
) ||
die
...;
Please note: Net::IP::Lite::Net allows you to create an network (without possible hosts).
For example:
$net
= Net::IP::Lite::Net->new(
'10.10.10.8/28'
);
You can use the <"contains" method to check whether there are any possible hosts or not.
All Net:IP::Lite methods return the same values as if you created Net::IP::Lite object without a mask.
$net
= Net::IP::Lite::Net->new(
'1:: ffff::'
) ||
die
...;
$net
->address;
# 1::
See also: "Net::IP::Lite object"
mask
Returns Net::IP::Lite instance for the network mask;
$net
= Net::IP::Lite::Net->new(
'1:: ffff::'
) ||
die
...;
$net
->mask->address();
# ffff::
$net
= Net::IP::Lite::Net->new(
'1::/32'
) ||
die
...;
$net
->mask->address();
# ffff:ffff:0:0:0:0:0:0
$net
= Net::IP::Lite::Net->new(
'10.0/8'
) ||
die
...;
$net
->mask->binary();
# 11111111000000000000000000000000
network
Returns the original network definition that was specified as the constructor argument.
my
$net
= Net::IP::Lite::Net->new(
'1::/32'
) ||
die
...;
$net
->network();
# 1::/32
contains
Verifies whether an IP in the net.
$net
= Net::IP::Lite::Net->new(
'1:: ffff::'
) ||
die
...;
$in
=
$net
->contains(
'1:ff::1'
);
# TRUE
Also you can pass an Net::IP::Lite object:
$ip
= Net::IP::Lite::Net->new(
'1::1'
) ||
die
...;
$net
= Net::IP::Lite::Net->new(
'1::/32'
) ||
die
...;
my
$in
=
$net
->contains(
$ip
);
# TRUE
This method also can be used to check whether there are possible hosts in the network or not:
$net
= Net::IP::Lite::Net->new(
'10.10.10.8/28'
);
$ok
=
$net
->contains(
$net
);
# FALSE
$net
= Net::IP::Lite::Net->new(
'10.10.10.8/29'
);
$ok
=
$net
->contains(
$net
);
# TRUE
See also: "ip_in_range", "Net::IP::Lite object"
SEE ALSO
NET::IP, NetAddr::IP, NetAddr::IP::Lite
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Net::IP::Lite
You can also look for information at:
Code Repository at GitHub
GitHub Issue Tracker
RT, CPAN's request tracker
AUTHOR
Alexey A. Komarov <alexkom@cpan.org>
COPYRIGHT
2013 Alexey A. Komarov
LICENSE
This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself.