The grant_root_access subroutines in Linux.pm and Windows.pm accept a hash reference argument which must contain a username key. The username is the only piece of information grant_root_access needs.
grant_root_access is also currently using a root_access key. It makes no sense to call this subroutine and then have it check if it should have been called in the first place. The caller should be responsible for this.
The hash reference argument was presumably a result of copying and pasting the arguments accepted by its caller, the create_user subroutine which requires the other pieces of information contained in the hash reference.
There is no point of passing information to grant_root_access which it doesn't need. It would be better programming style to pass it a simple string containing the username.