Other monks have already pointed you in the right direction with passing structures by reference.
I just want to point out that it is possible not to pass by reference for your benefit.
A simple hash basically has keys and corresponding values. Knowning this, you can write your code like this:
whatever(%hash, $val)
...
sub whatever
{
my $v = pop;
my %h = @_; # %hash was expanded into list of key-value pairs
# reconstruct hash from array of key-value pairs
...
}