【问题标题】:Perl mysql, why does this fetchrow_array not work?Perl mysql,为什么这个 fetchrow_array 不起作用?
【发布时间】:2012-10-22 21:52:24
【问题描述】:

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

【问题讨论】:

  • 你真的需要error handling
  • @sputnick - 我们看不到连接,那里可能存在 RaiseError,但我很怀疑。

标签: mysql perl


【解决方案1】:

现在您正在执行fetchrow_array,它返回一个列表,但您尝试将其存储在标量中,您可以将其更改为fetchrow_arrayref 或将$row 更改为@row,或更改@987654325 @到my ($row)

【讨论】:

  • 完美!使用@row 就像一个魅力。不过,我很困惑,因为我以前使用过这种确切的格式,而且它在没有@row 的情况下也能正常工作。也许存在列类型差异或其他原因:/
  • 不,perl 不会在标量上下文中返回数组(实际上 perl 从不返回数组,只返回列表)。 @bladepanthera:请参阅我对可能罪魁祸首的回答
  • @ysth - 也许这取决于 DBD。刚刚使用 DBD::Oracle 进行了测试,并且选择一列在标量上下文中可以正常工作。不过,我不会普遍依赖这一点,因为文档警告不要这样做。
  • @runrig: 但是选择的值是假的吗?它应该依赖于 DBD,除非选择返回多个列。
【解决方案2】:

当你说:

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 中,标量上下文中的列表赋值返回赋值右侧的元素计数,特别是这样的代码将工作就好。

【讨论】:

    【解决方案3】:
    $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(',',@$_);
    }
    

    【讨论】:

      【解决方案4】:

      您应该尝试将代码中的fetchrow_array 替换为fetchrow_arrayref

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 2011-02-18
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        相关资源
        最近更新 更多