Оценка равенства в Perl с использованием элементов, взятых из массива ref - PullRequest
1 голос
/ 08 сентября 2011

У меня есть небольшой Perl-скрипт, который должен оценить равенство двух параметров и небольшой возврат из базы данных.

my ($firstId, $secondId, $firstReturnedId, $secondReturnedId, $picCount);
my $pics = $dbh->prepare(qq[select id from pictures limit 10]);

$firstId = q->param('firstId');
$secondId = q->param('secondId');

$pics->execute or die;
my $picids = $pics->fetchall_arrayref;

$picCount = scalar(@{$picids});
$firstReturnedId = $picCount > 0 ? shift(@{$picids}) : 0;
$secondReturnedId = $picCount > 1 ? pop(@{$picids}) : $firstReturnedId;

Здесь, быстрый взгляд на мой отладчик показывает, что $ picCount = 1 и $ firstReturnedId = 9020 и $ secondReturnedId = 9020. Однако оба они обозначены как

ARRAY(0x9e79184)
0 9020

в отладчике, поэтому, когда я выполняю окончательную проверку

my $result = (($firstId == $firstReturnedId) && ($secondId == $secondReturnedId)) ? 1 : 0;

Я получаю $ result = 0, а это не то, что я хочу.

Что я делаю не так?

1 Ответ

3 голосов
/ 08 сентября 2011

DBI::fetchall_arrayref возвращает ссылку на список «результатов строки».Но поскольку в результате строки может быть более одного значения (например, ваш запрос мог быть select id,other_field from pictures), каждый результат строки также является ссылкой на список.Это означает, что у вас есть еще одна разыменование, чтобы получить желаемый результат.Попробуйте:

$picCount = scalar(@{$picids});
if ($picCount > 0) {
    my $result = shift @{$picids};
    $firstReturnedId = $result->[0];
} else {
    $firstReturnedId = 0;
}
if ($picCount > 1) {
    my $result = pop @{$picids};
    $secondReturnedId = $result->[0];
} else {
    $secondReturnedId = $firstReturnedId;
}

или, если вы все еще хотите использовать сжатый стиль:

$firstReturnedId = $picCount > 0 ? shift(@{$picids})->[0] : 0;
$secondReturnedId = $picCount > 1 ? pop(@{$picids})->[0] : $firstReturnedId;
...