in reply to Default Values in Subroutines

If something doesn't have a default, just omit it from your %defaults hash. Or specify its value as undef (but not in qw(), since that would produce the string "undef"). But in the case of id, you are interpolating it in a string; what do you want there if it isn't provided? I'm guessing nothing, which you would accomplish by giving an empty string as the default (also not possible in qw()):
my %defaults = ( ..., 'id' => '', ... );
Your example doesn't use bootpw, so I'm not sure what you want for that.