В вашем цикле while
вы присваиваете @row
и затем сохраняете ссылку на этот массив. Однако каждый раз, когда цикл повторяется, вы заменяете содержимое @row
без объявления нового массива. Итак, в конце все ваши ссылки указывают на одно и то же.
В вашем коде здесь:
my(@row)=();
my($tempCount) = 0;
while ( @row = $qry->fetchrow_array ) {
$tempCount = scalar @row;
$logger->debug("Size of retrieved SQL Array : $tempCount");
$criteria{$row[0]} = \@row;
##@{$criteria{$row[0]} } = \@row;
}
Каждый раз, когда цикл while повторяется, вы присваиваете новые значения массиву @row
. Но поскольку строка my(@row)=();
находится вне цикла, массив @row
всегда одинаков. Поэтому каждый раз, когда вы присваиваете массиву, вы меняете то, что хранится во всех ссылках, которые вы уже взяли.
Чтобы исправить проблему, вам нужно объявлять новый массив для каждой итерации. Самый простой способ сделать это - переместить объявление в условие while:
my($tempCount) = 0;
while ( my @row = $qry->fetchrow_array ) {
$tempCount = scalar @row;
$logger->debug("Size of retrieved SQL Array : $tempCount");
$criteria{$row[0]} = \@row;
##@{$criteria{$row[0]} } = \@row;
}
Теперь каждый раз, когда вы берете ссылку \@row
, вы будете получать ссылку на новый массив.
Если бы ваш $qry->fetchrow_array
метод возвратил ссылку на массив, у вас не было бы проблемы:
my $row;
while ($row = $qry->fetchrow_array) {
$logger->debug("Size of retrieved SQL Array : ".@$row);
$criteria{$$row[0]} = $row; # already a reference
}
Но я все равно написал бы это как while (my $row = ...
в своем собственном коде, так как держать небольшие области видимости - это хорошо.