Perl mysql,为什么这个fetchrow_array不起作用?

时间:2012-10-11 13:55:48

标签: mysql perl

我有这样的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 个答案:

答案 0 :(得分:7)

现在你正在做,fetchrow_array会返回一个列表,但你试图将它存储在标量中,你可以将其更改为fetchrow_arrayref或将$row更改为{{ 1}},或将@row更改为my $row

答案 1 :(得分:4)

当你说:

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

从行返回一个值,分配到$ row,然后测试真值。 只要返回false的技能值,循环就会终止,而不会将该值放在@preList中。如果第一行结果的技能为NULL或“”或“0”,您将看到您看到的结果。

更改为:

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

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

答案 2 :(得分: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(',',@$_);
}

答案 3 :(得分:0)

您应尝试使用fetchrow_array替换代码中的fetchrow_arrayref