Аргументы передаются в функцию в виде плоского списка скаляров, поэтому
some_sub($a, %{$hash})
содержит ключи и значения хэша, переданные в виде списка после $a
some_sun($a, key, value, ...);
Когда эти пары ключ-значение назначаются хешу в функции, после этого вы работаете непосредственно со ссылками (ваши значения хеша), поэтому данные в вызывающей стороне изменяются.
Не указано, для чего предназначениено если вы не хотите, чтобы данные вызывающего абонента изменяли одно исправление, это избегает изменения данных в подпрограмме, возможно, путем введения локальных переменных для каждой ссылки, с которой сталкивается обработка.Если они сами могут содержать ссылки, вам все равно нужно быть очень осторожным.
Проще сделать полную глубокую копию хэша, если структура данных не велика.Например
use Storable qw(dclone);
some_sub($v, $hashref);
sub some_sub {
my ($var, $hr) = @_;
my $cloned_hashref = dclone($hr);
# work away with $cloned_hashref
}