Always check the status of your
open calls! You'll spend less time debugging mysterious errors, I promise.
open (DHCPCMD, "dhcpcmd $DHCPserver enumclients $scope|") || die "Can't get DHCP information: $!";
Use
sprintf instead of twodigit():
my $day = sprintf("%02d", localtime->mday);
I'm not sure what comparehashes() is doing, especially as you refer to
$1 but don't appear to grab it from anywhere. Instead, I'd
lc() machine names when assigning them to %dhcphash and %dnshash and just use the
eq operator to compare them.
Finally, I like to check the return values of my close() calls. No pun intended. If something goes wrong here, I want to know about it.