Конкретная проблема заключается в том, что вы можете передать только массив, поэтому сначала нужно разыменовать массив, а затем, поскольку он находится в более крупной структуре данных, вы хотите установить его значение в качестве ссылки.
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my %acc = ();
# don't use & to call subs; that overrides prototypes (among other things)
# which you won't need to worry about, because you shouldn't be using
# prototypes here; they're used for something else in Perl.
insert_a(\%acc, 11);
insert_p(\%acc, 111);
# use \%acc to print as a nice-looking hashref, all in one variable
print Dumper \%acc;
# don't use () here - that's a prototype, and they're used for other things.
sub insert_a {
my $acc_ref = shift;
$acc_ref->{"$_[0]"} = {
a => -1,
b => -1,
c => [ { }, ],
}
}
# same here
sub insert_p {
my $acc_ref = shift;
my @AoH = (
{
d => -1,
e => -1,
}
);
# You need to dereference the first array, and pass it a reference
# as the second argument.
push @{ $acc_ref->{"$_[0]"}{"c"} }, \@AoH;
}
Я не совсем уверен, что полученная структура данных соответствует вашим ожиданиям, но теперь, когда программа работает и вы можете видеть полученную структуру, вы можете изменить ее, чтобы получить то, что вам нужно.