1

我有这样的 Perl 代码:

$pre = $dbh->prepare("select distinct skills from people");
$pre->execute;

my @preList;
while (my $row = $pre->fetchrow_array()) {
    push (@preList,$row);
}
print "Pre list: $_" foreach @preList;

当我在 sql 中尝试完全相同的语句时,它工作得很好,但是当我运行这个程序时,它什么也没打印出来(建议一个空的@preList)。我可能正在做一些非常愚蠢的事情,但看不到它。我以前使用过这种格式来获取数据,效果很好。谁能看到我做错了什么?

4

4 回答 4

7

现在你正在做,fetchrow_array它返回一个列表,但你试图将它存储在一个标量中,你可以将它更改为fetchrow_arrayref或更改$row@row,或更改my $rowmy ($row).

于 2012-10-11T14:00:45.610 回答
4

当你说:

while (my $row = $pre->fetchrow_array()) {

从一行返回一个值,分配给 $row,然后测试其是否为真。一旦返回错误的技能值,循环将终止,而不将该值放入@preList。如果第一行结果的技能为NULL或“”或“0”,您将看到您所看到的结果。

更改为:

while (my ($row) = $pre->fetchrow_array()) {

(或使用@row,正如其他人所建议的那样),仍然从每一行返回一个值,并将其分配给 $row,但不是测试该值是否为真,而是测试从 fetchrow_array 返回的元素数是否为真(并且fetchrow_array 在结果行用完时返回一个空列表,因此对于每行结果,此数字为 1,然后为 0 以终止循环)。发生这种情况是因为 while() 需要一个标量进行测试,因此给出了赋值标量上下文,而在 perl 中,标量上下文中的列表赋值返回赋值右侧的元素计数,特别是这样的代码将只是工作。

于 2012-10-11T16:42:06.560 回答
2
$pre = $dbh->prepare("select distinct skills from people");
$pre->execute;

my @preList;
while (my $row = $pre->fetch()) {
    push (@preList,$row);
}
foreach @preList{
    print "Pre list row: " . join(',',@$_);
}

或者:

$pre = $dbh->prepare("select distinct skills from people");
$pre->execute;

my $preList = $pre->fetchall_arrayref();

foreach @$preList{
    print "Pre list row: " . join(',',@$_);
}
于 2012-10-11T14:25:42.773 回答
0

您应该尝试fetchrow_array在代码中替换为fetchrow_arrayref.

于 2012-10-11T13:59:18.843 回答