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.
in reply to DHCP and DNS Compare
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.