#! /usr/bin/env perl use strict; use warnings; use Net::IP::AddrRanges; use Net::CIDR::Lite; our @ip = qw(10.144.128.0/18 10.144.192.0/19 10.144.224.0/20 10.144.240.0/21 10.144.248.0/22 10.144.252.0/23 10.144.254.0/24 10.144.255.0/25 10.144.255.128/26 10.144.255.192/27 10.144.255.224/28 10.144.255.240/29 10.144.255.248/30 10.144.255.252/31 10.144.255.254/32); my $ranges = Net::IP::AddrRanges->new(); $ranges->add(@ip); my @ranges = $ranges->list_ranges; if ( 1 == @ranges ) { # good, we only expected a single range if ( "254" eq substr( $ranges[0], -3, 3 ) ) { $ranges->add( substr( $ranges[0], 0, -3 ) . '255' ); } } my $cidr = Net::CIDR::Lite->new; $cidr->add_range( $_ ) for $ranges->list_ranges; print join "\n", $cidr->list(), ""; __END__ Result: 10.144.128.0/17