Я вижу несколько проблем в вашем коде. Рассмотрим эти строки:
$HoA{$id} = [ split(//) ]; # Splits the contents to allow for position reference later
$loscore{$id} .= 0; # Creates a hash with each id number to have a log-odds score (initial score 0)
$maxscore{$id} .= -30; # Creates a hash with each id number to have a maxscore (initial score -30)
Согласно вашим комментариям, вы хотите инициализировать записи %loscore
и %maxscore
с 0 и -30. Однако вместо использования старого доброго знака =
вы используете оператор .=
(который добавляет строки). Я не думаю, что это то, что вы хотите, поэтому подумайте об изменении .=
на =
.
(Или, может быть, вы намеревались использовать //=
вместо этого. Таким образом, если %loscore
и %maxscore
уже имеют запись $id
, она не будет перезаписана. Но только вы можете сказать наверняка, если вы предназначен для использования оператора //=
.)
Итак, теперь давайте посмотрим на $loscore{$id} = 0
. Это говорит нам о том, что %loscore
- это хеш (или «связанный массив»), который для каждой записи принимает $ id для ключа и число в качестве значения.
Тем не менее, ниже в вашем коде у вас есть это:
@{ $loscore{$id} } = @arr;
Тот факт, что $loscore{$id}
заключен в ${ ... }
, говорит нам, что значения в %loscore
являются ссылками на массив. Но мы уже установили выше, что его значения являются числами!
И поскольку вы рассматриваете число как ссылку на массив, Perl видит в этом ошибку.
То, что вы возможно хотели написать вместо этого, было:
@{ $HoA{$id} } = @arr;
Поскольку значения в хэше %HoA
содержат ссылки на массивы, имеет смысл отменить ссылку на как на массив.