我正在尝试理解以下代码,特别是第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";
答案 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
行检查
定义了顶级引用$r
(调用有效),
该数组的大小@$r
正好是1
- 因此,该数组只包含一个元素。这背叛了对查询将返回一行的期望,并且由于代码已准备好die
,因此它可能会要求fetchrow_arrayref或fetchrow_array一行。
@$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行。
请参阅perlreftut和perldsc。