如何在Perl中检查fetchall_arrayref方法返回的行?

时间:2017-08-24 20:42:34

标签: perl dbi

我正在尝试理解以下代码,特别是第4,5和6行中发生的情况。

我已经理解了大部分内容,但似乎无法理解第4行中@$r != 1;正在做什么(@$r表示返回的行数是多少?)同样地发生了什么第5行@$r[0],第6行@$rr[0]

1 my $sth = $dbh->prepare(" a select statement ");
2    $sth->execute();
3   my $r = $sth->fetchall_arrayref();
4  die "Failed to select " if !defined($r) || @$r != 1;
5   my $rr = @$r[0];
6    my $rec = @$rr[0];
7   print "Rec is $rec\n";

2 个答案:

答案 0 :(得分:3)

在标量上下文中计算数组(引用)将返回数组中的元素数。你的其他问题的答案是,它只是使用丑陋的语法和无用的中间变量进行标准解除引用。

我相信教人们如何捕鱼,所以请考虑这段代码,这本质上就是你所使用的:

use strict;
use warnings;

use Data::Dumper;

my $r   = [[1, 2, 3]];
my $rr  = @$r[0];
my $rec = @$rr[0];

print Dumper($r, $rr, $rec);

输出:

$VAR1 = [
          [
            1,
            2,
            3
          ]
        ];
$VAR2 = $VAR1->[0];
$VAR3 = 1;

现在应该很容易看到你能看到每个变量的含义,对吧?

答案 1 :(得分:3)

fetchall_arrayref()返回对所有行数组的引用,其中每个元素也是对该行的元素的引用。

然后die行检查

  1. 定义了顶级引用$r(调用有效),

  2. 该数组的大小@$r正好是1 - 因此,该数组只包含一个元素。这背叛了对查询将返回一行的期望,并且由于代码已准备好die,因此它可能会要求fetchrow_arrayreffetchrow_array一行。

  3. @$r取消引用$r arrayref,在!=强加的标量上下文中,我们确实获得了列表中元素的数量。

    第5行是非常误导的,至少可以说,即使语法恰好合法:它提取第一个元素并将其提供给标量,但使用@$r[0]语法通常意味着我们正在通过它的印记@得到一个列表。它等同于@{$r}[0],是滥用符号。

    它应该清楚地得到第一个元素,如果它是意图

    my $rr = $r->[0];
    

    或者也取消引用它以获得整个数组

    my @row = @{ $r->[0] };
    

    如果需要的话。

    您查询的最后一行使用检索到的$rr引用完全相同。但是第一个arrayref(行)的第一个元素很容易直接获得

    my $rec = $r->[0]->[0];  # or $r->[0][0]
    

    什么取代了第5和第6行。

    请参阅perlreftutperldsc