1

我有一个小的 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,这不是我想要的。

我究竟做错了什么?

4

1 回答 1

3

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;
于 2011-09-08T15:47:18.087 回答