我有这样的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
)。我可能正在做一些非常愚蠢的事情,但看不到它。我之前使用过这种格式来获取数据,效果很好。谁能看到我做错了什么?
答案 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
。