johngg@shiraz:~/perl/Monks > perl -Mstrict -Mwarnings -MSocket -E ' do { print qq{Old IP: $_ ... }; my $isOdd = substr( $_, -1 ) % 2; my $IPn = unpack q{N}, inet_aton( $_ ); $IPn += ( $isOdd ? 1 : -1 ); my $newIP = inet_ntoa( pack( q{N}, $IPn ) ); say qq{New IP: $newIP}; } for qw{ 10.1.1.5 10.1.1.6 };' Old IP: 10.1.1.5 ... New IP: 10.1.1.6 Old IP: 10.1.1.6 ... New IP: 10.1.1.5 #### johngg@shiraz:~/perl/Monks > perl -Mstrict -Mwarnings -MSocket -E ' my $IP = q{10.1.1.255}; my $packed = inet_aton( $IP ); printf qq{%8d %8d %8d %8d\n}, map ord, split m{}, $packed; printf qq{%8s %8s %8s %8s\n}, unpack q{(B8)*}, $packed;' 10 1 1 255 00001010 00000001 00000001 11111111 #### use strict; use warnings; use Socket; my @IPs = qw{ 10.1.1.5 10.1.1.6 172.16.0.0 192.168.33.17 192.168.331.54 192.168.33.74 172.16.204.255 0.0.0.0 255.255.255.255 10.1.255.255 }; foreach my $IP ( @IPs ) { my $packed = inet_aton( $IP ); do { warn qq{Error: $IP is not a valid IPv4 address\n}; next; } unless defined $packed; my $numeric = unpack q{N}, $packed; my $isOdd = substr( $IP, -1 ) % 2; $numeric += ( $isOdd ? 1 : -1 ); my $newIP = inet_ntoa( pack( q{N}, $numeric ) ); printf qq{Old IP: %15s ... New IP: %15s\n}, $IP, $newIP; } #### Old IP: 10.1.1.5 ... New IP: 10.1.1.6 Old IP: 10.1.1.6 ... New IP: 10.1.1.5 Old IP: 172.16.0.0 ... New IP: 172.15.255.255 Old IP: 192.168.33.17 ... New IP: 192.168.33.18 Error: 192.168.331.54 is not a valid IPv4 address Old IP: 192.168.33.74 ... New IP: 192.168.33.73 Old IP: 172.16.204.255 ... New IP: 172.16.205.0 Old IP: 0.0.0.0 ... New IP: 255.255.255.255 Old IP: 255.255.255.255 ... New IP: 0.0.0.0 Old IP: 10.1.255.255 ... New IP: 10.2.0.0