В двух местах вы пытаетесь присвоить хеш-ссылку хешу, что приводит к этому предупреждению: Ссылка найдена там, где ожидается чётный список .
Вот две правки, которые вам нужны:
# I changed {} to ().
# However, you never use %hashes, so I'm not sure why it's here at all.
my %hashes = (1,2,3,40);
# I added %{} around the right-hand side.
%list1 = %{$ref->{$SingleAuthor1}};
См. perlreftut для полезного и краткого обсуждения сложных структур данных.
Для чего бы то ни было, ваш метод counter()
может быть упрощен без потери читабельности путем удаления промежуточных переменных.
sub counter {
my $tallies = shift;
foreach my $author (keys %$tallies) {
foreach my $dig (keys %{$tallies->{$author}}) {
print $tallies->{$author}{$dig}, "\n";
}
}
}
Или, как указывает ysth, вот так, если вам не нужны ключи:
foreach my $author_digs (values %$tallies) {
print $dig, "\n" for values %$author_digs;
}