Вы называете свою подпрограмму так:
my $c=sum(3,%h1);
И внутри вашей подпрограммы вы получаете доступ к таким параметрам:
my $var1=shift;
my $var2=shift;
my %hash1=@_;
Кажется, здесь есть очевидное несоответствие. Вы передаете скаляр и хэш подпрограмме, но внутри подпрограммы вы ожидаете два скаляра и хеш.
Так что, возможно, все будет работать так, как вы ожидаете, если вы удалите строку my $var2 = shift
.
Не совсем понятно, для чего предназначена ваша подпрограмма. Если бы вы объяснили это, то, возможно, мы могли бы немного больше помочь.
Обновление: В вашем коде Data::Dumper
. Почему бы не использовать его, чтобы попытаться понять, что происходит.
print Dumper(\@_), "\n";
my $var1=shift;
my $var2=shift;
my %hash1=@_;
print Dumper($var1, $var2, \%hash1), "\n";
Я получаю:
$VAR1 = [
3,
'b',
3,
'a',
2
];
Odd number of elements in hash assignment at test line 11.
$VAR1 = 3;
$VAR2 = 'b';
$VAR3 = {
'3' => 'a',
'2' => undef
};
Который показывает пару интересных вещей:
- Хеш «разворачивается» в список, прежде чем помещается в
@_
.
- Предупреждение, которое вы получаете, когда инициализируете хеш из списка с нечетным числом элементов.
- Ваша переменная
%hash1
с неверными ключами и значениями.