Я вижу две проблемы.
$longHash{$mlid} = ()
Вы пытаетесь установить скалярное поле в список. {$ mlid} `должен быть установлен в список ref , а не в список. Самое простое исправление - $longHash{$mlid} = []
, но это не решит реальную проблему.
2.
$longHash{$mlid}[$y] = [ @a ];
в сочетании с $longHash{$mlid} = ();
Вы очищаете $longHash{$mlid}
на каждом проходе через цикл, затем пытаетесь присвоить ненулевой индекс. Может быть, вам нужен хеш хеша, а не список.
UPDATE
В твоей новой версии я думаю
push @{$longHash{$mlid}}, [ @a ];
должно быть просто
$longHash{$mlid} = [ @a ];
ОБНОВЛЕНИЕ 2
Я думаю, ваш код должен работать.
Это похоже на мой упрощенный пример ниже:
my %hash;
my @a;
$a[0] = "Fred";
$a[1] = 31;
$a[2] = "Melbourne";
push @{$hash{7202}}, [ @a ];
$a[0] = "Mary";
$a[1] = 25;
$a[2] = "Sydney";
push @{$hash{7202}}, [ @a ];
print $hash{7202}[0][0] . "\n";
print $hash{7202}[1][0] . "\n";
ОБНОВЛЕНИЕ 3
Пожалуйста, добавьте
use warnings;
use strict;
, чтобы гарантировать, что все индексы массива, которые вы считаете существующими, существуют.
И попробуйте перебрать ваши данные, чтобы напечатать их, например,
for my $mlid (keys %hash) {
my $recordref = $hash{$mlid};
my @record = @$recordref;
for my $i (0..scalar(@record)-1) {
printf "mlid %s person %d name %s\n", $mlid, $i, $record[$i][0];
}
}