http://www.perlmonks.org?node_id=425652
Description:

I'm setting up a new segment in my network that will be managed by DHCP. I estimate that a /22 net, with just over one thousand addresses (1022 to be precise), gives me sufficient space for a dynamic pool and room to spare to allow mapping of known MACs to IP addresses in the future.

To start the ball rolling, I figured I'd just start with just about all of it assigned dynamically, with a bit left over. So, why not 1000 contiguous addresses in a dynamic pool, and 22 left over: one for the router and 21 to play with.

Ok, so the start address is easy, but how to find the end address quickly and make sure I don't make a mistake? NetAddr::IP to the rescue.

I actually did this as a one-liner, but this is a bit more readable.

Now to edit my dhcpd.conf file...

#! /usr/local/bin/perl -wl

use NetAddr::IP;

my $first = shift || '172.17.220.1';
my $nr    = shift || 1000;

my $end = NetAddr::IP->new($first)->numeric + $nr;
print $end->addr;

# prints 172.17.223.233