in reply to Transferring local hashes to module subroutines

In the call to the subroutine, you're passing a (nonexistent) scalar, not the hash you think you're passing:
# you're doing: return &Y::module_subroutine($hash_to_send); # should be: return &Y::module_subroutine(%hash_to_send);
As well, in the subroutine, you're assigning a scalar value, when you want a list context:
# you're doing: my($hash) = @_; # should be: my %hash = @_;
These kinds of things are easy to miss, which is why it's recommended to use the strict pragma...It should kick up warning messages in such cases.

 

Addendum: Also wanted to add that if you're only ever passing a single hash to your subroutine, and it's not going to be an extremely large hash, then passing by value is workable. If you want to pass other parameters, or a massive hash (megabytes worth of data, yes I've seen this done), then you'd want to pass a reference:

# passing it in... return &Y::module_subroutine(\%hash_to_send); # and assigning it within the subroutine... my $hash = shift; # and when using it in the sub, be sure to dereference... return "The colour of the sky is " . $hash->{third_colour};

__________
Systems development is like banging your head against a wall...
It's usually very painful, but if you're persistent, you'll get through it.